永久帶又叫Perm區,只存在於hotspot jvm中,並且只存在於jdk7和之前的版本中,jdk8中已經徹底移除了永久帶,jdk8中引入了一個新的內存區域叫metaspace。
(1)並不是所有的jvm中都有永久帶,ibm的j9,oracle的JRocket都沒有永久帶。
(2)永久帶是實現層面的東西。
(3)永久帶里面存的東西基本上就是方法區規定的那些東西。
因此,我們可以說,永久帶是方法區的一種實現,當然,在hotspot jdk8中metaspace可以看成是方法區的一種實現。
為什么要移除永久代:
1.移除永久代是為融合HotSpot JVM與 JRockit VM而做出的努力,因為JRockit沒有永久代,不需要配置永久代
2.由於永久代內存經常不夠用或發生內存泄露,爆出異常java.lang.OutOfMemoryError: PermGen
元空間是方法區的在HotSpot jvm 中的實現,方法區主要用於存儲類的信息、常量池、方法數據、方法代碼等。方法區邏輯上屬於堆的一部分,但是為了與堆進行區分,通常又叫“非堆”。
元空間的本質和永久代類似,都是對JVM規范中方法區的實現。不過元空間與永久代之間最大的區別在於:元空間並不在虛擬機中,而是使用本地內存。,理論上取決於32位/64位系統可虛擬的內存大小。可見也不是無限制的,需要配置參數。
常用配置參數
1.MetaspaceSize
初始化的Metaspace大小,控制元空間發生GC的閾值。GC后,動態增加或降低MetaspaceSize。在默認情況下,這個值大小根據不同的平台在12M到20M浮動。使用Java -XX:+PrintFlagsInitial命令查看本機的初始化參數
2.MaxMetaspaceSize
限制Metaspace增長的上限,防止因為某些情況導致Metaspace無限的使用本地內存,影響到其他程序。在本機上該參數的默認值為4294967295B(大約4096MB)。
3.MinMetaspaceFreeRatio
當進行過Metaspace GC之后,會計算當前Metaspace的空閑空間比,如果空閑比小於這個參數(即實際非空閑占比過大,內存不夠用),那么虛擬機將增長Metaspace的大小。默認值為40,也就是40%。設置該參數可以控制Metaspace的增長的速度,太小的值會導致Metaspace增長的緩慢,Metaspace的使用逐漸趨於飽和,可能會影響之后類的加載。而太大的值會導致Metaspace增長的過快,浪費內存。
4.MaxMetasaceFreeRatio
當進行過Metaspace GC之后, 會計算當前Metaspace的空閑空間比,如果空閑比大於這個參數,那么虛擬機會釋放Metaspace的部分空間。默認值為70,也就是70%。
5.MaxMetaspaceExpansion
Metaspace增長時的最大幅度。在本機上該參數的默認值為5452592B(大約為5MB)。
6.MinMetaspaceExpansion
Metaspace增長時的最小幅度。在本機上該參數的默認值為340784B(大約330KB為)。