Jvm的metadata和compressed class space含義

在對java jvm進行性能監控時,發現了兩個新名詞Meta space和compressed class space ,通過查閱一些資料下面進行一下總結。

Meta space


元空間(metaspace)這是在java8纔出現的新概念,在java6中堆結構如下圖:

這裏寫圖片描述

持久代中存的內容
1. JVM中類的元數據在Java堆中的存儲區域。
2. Java類對應的HotSpot虛擬機中的內部表示也存儲在這裏。
3. 類的層級信息,字段,名字。
4. 方法的編譯信息及字節碼。
5. 變量
6. 常量池和符號解析
GC是可以對持久代進行垃圾收集的
然而在java8中把持久代(Permanent Generation)移除了替代品就是元空間(Meta space)
元空間的特點:

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

下圖是JVM是如何給元數據分配虛擬內存的空間的

這裏寫圖片描述

你可以看到虛擬內存空間是如何分配的(vs1,vs2,vs3) ,以及類加載器的內存塊是如何分配的。CL是Class Loader的縮寫。
說了這麼多,如果不理解的話,一句話就是優化了性能


Compressed class space


先看一副圖:

這裏寫圖片描述

JVM中,每個對象都有一個指向它自身類的指針,不過這個指針只是指向具體的實現類,而不是接口或者抽象類。

對於32位的JVM:

_mark : 4字節常量

_klass: 指向類的4字節指針 對象的內存佈局中的第二個字段( _klass,在32位JVM中,相對對象在內存中的位置的偏移量是4,64位的是8)指向的是內存中對象的類定義。

64位的JVM:

_mark : 8字節常量

_klass: 指向類的8字節的指針
對於64位平臺,爲了壓縮JVM對象中的_klass指針的大小,引入了類指針壓縮空間(Compressed Class Pointer Space)。
就是爲了省內存
看下面這幅圖就秒懂了:

這裏寫圖片描述

OK到這裏這兩個概念應該理解了

注:本文一些內容粘貼自Java 8 的元空間
這裏圖片看不出,閱讀起來比較困難,所以進行一個總結

發佈了40 篇原創文章 · 獲贊 78 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章