JDK8 元空間


1. 運行時常量池和靜態變量都存儲到了堆中,MetaSpace存儲類的元數據,MetaSpace直接申請在本地內存中(Native memory),這樣類的元數據分配只受本地內存大小的限制,OOM問題就不存在了。除此之外,還有其他很多好處:

2. 其實,移除永久代的工作從JDK1.7就開始了。JDK1.7中,存儲在永久代的部分數據就已經轉移到了Java Heap或者是 Native Heap。但永久代仍存在於JDK1.7中,並沒完全移除,譬如符號引用(Symbols)轉移到了native heap;

    字面量(interned strings)轉移到了java heap;類的靜態變量(class statics)轉移到了java heap。

3. JDK8 HotSpot JVM 將移除永久區,使用本地內存來存儲類元數據信息並稱之為:元空間(Metaspace)。這意味着不會再有java.lang.OutOfMemoryError: PermGen問題,也不再需要你進行調優及監控內存空間的使用。

    總結:

        PermGen空間狀況:這部分內存空間將全部移除。JVM的參數:PermSize 和 MaxPermSize 會被忽略並給出警告(如果在啟用時設置了這兩個參數)。

        Metaspace 容量:默認情況下,類元數據只受可用的本地內存限制(容量取決於是32位或是64位操作系統的可用虛擬內存大小)。新參數(MaxMetaspaceSize)用於限制本地內存分配給類元數據的大小。如果沒有指定

        這個參數,元空間會在運行時根據需要動態調整。

        另外,對於僵死的類及類加載器的垃圾回收將在元數據使用達到“MaxMetaspaceSize”參數的設定值時進行。適時地監控和調整元空間對於減小垃圾回收頻率和減少延時是很有必要的。持續的元空間垃圾回收說明,

        可能存在類、類加載器導致的內存泄漏或是大小設置不合適。

4. 總結

    1). 之前不管是不是需要,JVM都會吃掉那塊空間……如果設置得太小,JVM會死掉;如果設置得太大,這塊內存就被JVM浪費了。理論上說,現在你完全可以不關注這個,因為JVM會在運行時自動調校為“合適的大小”; 

    2). 提高Full GC的性能,在Full GC期間,Metadata到Metadata pointers之間不需要掃描了,別小看這幾納秒時間;

    3). 隱患就是如果程序存在內存泄露,像OOMTest那樣,不停的擴展metaspace的空間,會導致機器的內存不足,所以還是要有必要的調試和監控。

5. 深入理解元空間(Metaspace)

    1). 元空間的內存大小

         元空間是方法區的在HotSpot jvm 中的實現,方法區主要用於存儲類的信息、常量池、方法數據、方法代碼等。方法區邏輯上屬於堆的一部分,但是為了與堆進行區分,通常又叫“非堆”。

         元空間的本質和永久代類似,都是對JVM規范中方法區的實現。不過元空間與永久代之間最大的區別在於:元空間並不在虛擬機中,而是使用本地內存。,理論上取決於32位/64位系統可虛擬的內存大小。可見也不是無限制的,需要配置參數。

   2). 常用配置參數

          a. MetaspaceSize

              初始化的Metaspace大小,控制元空間發生GC的閾值。GC后,動態增加或降低MetaspaceSize。在默認情況下,這個值大小根據不同的平台在12M到20M浮動。使用Java -XX:+PrintFlagsInitial命令查看本機的初始化參數

         b. MaxMetaspaceSize

              限制Metaspace增長的上限,防止因為某些情況導致Metaspace無限的使用本地內存,影響到其他程序。在本機上該參數的默認值為4294967295B(大約4096MB)。

         c. MinMetaspaceFreeRatio

             當進行過Metaspace GC之后,會計算當前Metaspace的空閑空間比,如果空閑比小於這個參數(即實際非空閑占比過大,內存不夠用),那么虛擬機將增長Metaspace的大小。默認值為40,也就是40%。

             設置該參數可以控制Metaspace的增長的速度,太小的值導致Metaspace增長的緩慢,Metaspace的使用逐漸趨於飽和,可能會影響之后類的加載。而太大的值會導致Metaspace增長的過快,浪費內存。

         d. MaxMetasaceFreeRatio

             當進行過Metaspace GC之后, 會計算當前Metaspace的空閑空間比,如果空閑比大於這個參數,那么虛擬機會釋放Metaspace的部分空間。默認值為70,也就是70%。

         e. MaxMetaspaceExpansion

             Metaspace增長時的最大幅度。在本機上該參數的默認值為5452592B(大約為5MB)。

         f. MinMetaspaceExpansion

            Metaspace增長時的最小幅度。在本機上該參數的默認值為340784B(大約330KB為)。

 

 

 

 

 

 

參見:https://blog.csdn.net/pzxwhc/article/details/46722411

           https://www.cnblogs.com/dennyzhangdd/p/6770188.html


免責聲明!

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



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