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