java物件頭學習
術語參考:http://openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html
在JVM中,物件在記憶體中的布局分為三塊區域:物件頭、實體資料和對齊填充,如下圖所示:

_mark表示物件標記、屬于markOop型別,它記錄了物件和鎖有關的資訊;
Klass表示普通指標;
_compressed_klass表示壓縮類指標,
Mark Word
Mark Word用于存盤物件自身的運行時資料,如哈希碼(HashCode)、GC分代年齡、鎖狀態標志、執行緒持有的鎖、偏向執行緒ID、偏向時間戳等等,占用記憶體大小與虛擬機位長一致,
Klass pointer
? 64位虛擬機則其Klass pointer的大小為64位; 一般來說虛擬機都會開啟指標壓縮;即也就是說在64位虛擬機情況下其Klass pointer也會被壓縮成32位;
一些特殊型別的指標JVM不會優化,
比如執行PermGen的Class物件指標(JDK8中指向元空間的Class物件指標)、本地變數、堆疊元素、入參、回傳值和NULL指標等,
物件頭 = Mark Word + 型別指標(未開啟指標壓縮的情況下)
在64位系統中,Mark Word = 8 bytes, 型別指標 = 8bytes, 物件頭 = 16bytes = 128 bits;
實體資料
實體資料:物件實體資料(堆):物件中各個實體欄位的資料
##下面作為額外的知識
物件型別資料(方法區):物件的型別、父類、實作的介面、方法等
靜態區(也在方法區中)用來存放靜態變數,靜態塊
對齊填充
對齊填充并不是必然存在的,占位符的作用,由于HotSpot VM的自動記憶體管理系統 要求物件起始地址必須是8位元組的整數倍,換句話說,就是物件的大小必須是8位元組的整數倍,而物件頭正好是8位元組的整數倍,因此,當物件實體資料沒有對齊時,就需要通過對齊填充來補全,
再64為虛擬機中運行時其存盤結構如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291279.html
標籤:其他
上一篇:樹莓派超全介紹合集:2021 從0到1!(從購買 到 開始連接 到 開始配置 到 開始作業 一條龍)
下一篇:docker(持續更新中)
