元空間 GC

jdk8移除了PermGen,取而代之的是MetaSpace
元空間(Metaspace):
一種新的內存空間的誕生。JDK8 HotSpot JVM 使用本地內存來存儲類元數據信息並稱之爲:元空間(Metaspace);這與Oracle JRockit 和IBM JVM’s很相似。這將是一個好消息:意味着不會再有java.lang.OutOfMemoryError: PermGen問題,也不再需要你進行調優及監控內存空間的使用,但是新特性不能消除類和類加載器導致的內存泄漏。你需要使用不同的方法以及遵守新的命名約定來追蹤這些問題。

PermGen 空間的狀況
這部分內存空間將全部移除。

JVM的參數:PermSize 和 MaxPermSize 會被忽略並給出警告(如果在啓用時設置了這兩個參數)。

Metaspace 內存分配模型
(最大區別)大部分類元數據都在本地內存中分配。
用於描述類元數據的“klasses”已經被移除。

Metaspace 容量
默認情況下,類元數據只受可用的本地內存限制(容量取決於是32位或是64位操作系統的可用虛擬內存大小)。

新參數(MaxMetaspaceSize)用於限制本地內存分配給類元數據的大小。如果沒有指定這個參數,元空間會在運行時根據需要動態調整。

Metaspace 垃圾回收
對於僵死的類及類加載器的垃圾回收將在元數據使用達到“MaxMetaspaceSize”參數的設定值時進行。

適時地監控和調整元空間對於減小垃圾回收頻率和減少延時是很有必要的。持續的元空間垃圾回收說明,可能存在類、類加載器導致的內存泄漏或是大小設置不合適。

Java 堆內存的影響
一些雜項數據已經移到Java堆空間中。升級到JDK8之後,會發現Java堆 空間有所增長。

Metaspace 監控
元空間的使用情況可以從HotSpot1.8的詳細GC日誌輸出中得到。

Jstat 和 JVisualVM兩個工具,在我們使用b75版本進行測試時,已經更新了,但是還是能看到老的PermGen空間的出現。

參數設置
默認情況下,元空間的大小僅受本地內存限制,但可以通過以下參數來指定元空間的大小:

-XX:MetaspaceSize,初始空間大小,達到該值就會觸發垃圾收集進行類型卸載,同時GC會對該值進行調整:如果釋放了大量的空間,就適當降低該值;如果釋放了很少的空間,那麼在不超過MaxMetaspaceSize時,適當提高該值。

-XX:MaxMetaspaceSize,最大空間,默認是沒有限制的。

除了上面兩個指定大小的選項以外,還有兩個與 GC 相關的屬性:
-XX:MinMetaspaceFreeRatio,在GC之後,最小的Metaspace剩餘空間容量的百分比,減少爲分配空間所導致的垃圾收集

-XX:MaxMetaspaceFreeRatio,在GC之後,最大的Metaspace剩餘空間容量的百分比,減少爲釋放空間所導致的垃圾收集

更新原因
  1、字符串存在永久代中,容易出現性能問題和內存溢出。

  2、類及方法的信息等比較難確定其大小,因此對於永久代的大小指定比較困難,太小容易出現永久代溢出,太大則容易導致老年代溢出。

  3、永久代會爲 GC 帶來不必要的複雜度,並且回收效率偏低。

  4、Oracle 可能會將HotSpot 與 JRockit 合二爲一。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章