JVM源碼分析之java對象頭實現(xiàn)

轉(zhuǎn)載請注明原創(chuàng)出處,謝謝!
簡書占小狼
http://www.itdecent.cn/users/90ab66c248e6/latest_articles

HotSpot虛擬機(jī)中,對象在內(nèi)存中的布局分為三塊區(qū)域:對象頭、實例數(shù)據(jù)和對齊填充。

對象頭

對象頭包括兩部分:Mark Word 和 類型指針。

Mark Word

Mark Word用于存儲對象自身的運(yùn)行時數(shù)據(jù),如哈希碼(HashCode)、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向線程ID、偏向時間戳等等,占用內(nèi)存大小與虛擬機(jī)位長一致。

類型指針

類型指針指向?qū)ο蟮念愒獢?shù)據(jù),虛擬機(jī)通過這個指針確定該對象是哪個類的實例。

markOop實現(xiàn)

HotSpot通過markOop類型實現(xiàn)Mark Word,具體實現(xiàn)位于markOop.hpp文件中。
由于對象需要存儲的運(yùn)行時數(shù)據(jù)很多,考慮到虛擬機(jī)的內(nèi)存使用,markOop被設(shè)計成一個非固定的數(shù)據(jù)結(jié)構(gòu),以便在極小的空間存儲盡量多的數(shù)據(jù),根據(jù)對象的狀態(tài)復(fù)用自己的存儲空間,32位虛擬機(jī)的markOop實現(xiàn)如下:

hash: 保存對象的哈希碼
age: 保存對象的分代年齡
biased_lock: 偏向鎖標(biāo)識位
lock: 鎖狀態(tài)標(biāo)識位
JavaThread* 保存持有偏向鎖的線程ID
epoch: 保存偏向時間戳

markOop中不同的鎖標(biāo)識位,代表著不同的鎖狀態(tài):

不同的鎖狀態(tài),存儲著不同的數(shù)據(jù):


markOop中提供了大量方法用于查看當(dāng)前對象頭的狀態(tài),以及更新對象頭的數(shù)據(jù),為synchronized鎖的實現(xiàn)提供了基礎(chǔ)。


我是占小狼
坐標(biāo)魔都,白天是上班族,晚上是知識的分享者
如果讀完覺得有收獲的話,歡迎點贊加關(guān)注


我的微信公眾號
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容