天天看點

JDK8新特性之新記憶體空間MatespaceJDK8新特性之新記憶體空間Matespace

JDK8新特性之新記憶體空間Matespace

JDK8中使用元空間Matespace 替代持久代 PermGen space

持久代

PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域,說說為什麼會記憶體益出:這一部分用于存放Class和Meta的資訊,Class在被 Load的時候被放入PermGen space區域,它和和存放Instance的Heap區域不同,是以如果你的APP會LOAD很多CLASS的話,就很可能出現PermGen space錯誤。這種錯誤常見在web伺服器對JSP進行pre compile的時候。

JVM 種類有很多,比如 Oralce-Sun Hotspot, Oralce JRockit, IBM J9, Taobao JVM(淘寶好樣的!)等等。當然武林盟主是Hotspot了,這個毫無争議。需要注意的是,PermGen space是Oracle-Sun Hotspot才有,JRockit以及J9是沒有這個區域。

持久代中包含了虛拟機中所有可通過反射擷取到的資料,比如Class和Method對象。不同的Java虛拟機之間可能會進行類共享,是以持久代又分為隻讀區和讀寫區。

JVM用于描述應用程式中用到的類和方法的中繼資料也存儲在持久代中。JVM運作時會用到多少持久代的空間取決于應用程式用到了多少類。除此之外,Java SE庫中的類和方法也都存儲在這裡。

如果JVM發現有的類已經不再需要了,它會去回收(解除安裝)這些類,将它們的空間釋放出來給其它類使用。Full GC會進行持久代的回收。

為什麼移除持久代?

  • 它的大小是在啟動時固定好的——很難進行調優。-XX:MaxPermSize,設定成多少好呢?
  • HotSpot的内部類型也是Java對象:它可能會在Full GC中被移動,同時它對應用不透明,且是非強類型的,難以跟蹤調試,還需要存儲中繼資料的中繼資料資訊(meta-metadata)。
  • 簡化Full GC:每一個回收器有專門的中繼資料疊代器。
  • 可以在GC不進行暫停的情況下并發地釋放類資料。
  • 使得原來受限于持久代的一些改進未來有可能實作。

元空間Matespace

随着JDK8的到來,JVM不再有PermGen。但類的中繼資料資訊(metadata)還在,隻不過不再是存儲在連續的堆空間上,而是移動到叫做“Metaspace”的本地記憶體(Native memory)中。

特點:

  • 充分利用了Java語言規範中的好處:類及相關的中繼資料的生命周期與類加載器的一緻。
  • 每個加載器有專門的存儲空間
  • 隻進行線性配置設定
  • 不會單獨回收某個類
  • 省掉了GC掃描及壓縮的時間
  • 元空間裡的對象的位置是固定的
  • 如果GC發現某個類加載器不再存活了,會把相關的空間整個回收掉

原文位址:https://www.yuque.com/haomingzi-kowv5/pmcs3t/hc1xg6