JVM(二):jdk8廢除永久代迎來元空間


jdk8廢除永久代迎來元空間。

 

永久帶又叫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為)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM