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

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

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

對(duì)象頭

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

Mark Word

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

類型指針

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

markOop實(shí)現(xiàn)

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

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

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

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


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


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


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

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

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