轉(zhuǎn)載:http://www.reibang.com/p/9c19eb0ea4d8
HotSpot虛擬機(jī)中条获,對(duì)象在內(nèi)存中的布局分為三塊區(qū)域:對(duì)象頭剿吻、實(shí)例數(shù)據(jù)和對(duì)齊填充钉稍。
對(duì)象頭
對(duì)象頭包括兩部分:Mark Word 和 類(lèi)型指針。
Mark Word
Mark Word用于存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù)掸读,如哈希碼(HashCode)玻熙、GC分代年齡否彩、鎖狀態(tài)標(biāo)志、線程持有的鎖嗦随、偏向線程ID列荔、偏向時(shí)間戳等等,占用內(nèi)存大小與虛擬機(jī)位長(zhǎng)一致。
類(lèi)型指針
類(lèi)型指針指向?qū)ο蟮念?lèi)元數(shù)據(jù)贴浙,虛擬機(jī)通過(guò)這個(gè)指針確定該對(duì)象是哪個(gè)類(lèi)的實(shí)例砂吞。
markOop實(shí)現(xiàn)
HotSpot通過(guò)markOop類(lèi)型實(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:* 保存持有偏向鎖的線程IDepoch: 保存偏向時(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ǔ)。