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