轉(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)注
