分為三個部分:
(1)對象頭
第一部分:Mark Word。用于存儲自身的運行時數(shù)據(jù)问芬,包括哈希碼悦析、GC分代年齡寿桨、鎖狀態(tài)標志此衅、線程持有的鎖、偏向線程ID亭螟、偏向時間戳等挡鞍。
第二部分:類型指針。即對象指向它的元數(shù)據(jù)的指針预烙,虛擬機通過這個指針來確定這個對象是哪個類的實例墨微。不過并不是所有的虛擬機實現(xiàn)都必須在對象數(shù)據(jù)上保留類型指針,換句話說扁掸,查找對象的元數(shù)據(jù)信息并不一定要經(jīng)過對象本身翘县。另外,如果對象是一個Java數(shù)組谴分,那在對象頭中還必須有一塊用于記錄數(shù)組長度的數(shù)據(jù)锈麸,因為虛擬機可以通過普通Java對象的元數(shù)據(jù)信息確定Java對象的大小,但是從數(shù)組的元數(shù)據(jù)中卻無法確定數(shù)組的大小牺蹄。
(2)實例數(shù)據(jù)
實例數(shù)據(jù)部分是對象真正存儲的有效信息忘伞,也是在程序代碼中所定義的各種類型的字段內(nèi)容。無論是從父類繼承下來的,還是在子類中定義的氓奈,都需要記錄起來翘魄。這部分的存儲順序會受到虛擬機分配策略參數(shù)和字段在Java源碼中定義順序的影響。
(3)對齊填充
對齊填充并不是必然存在的舀奶,也沒有特殊的含義暑竟,它僅僅起著占位符的作用。由于HotSpot VM的自動內(nèi)存管理系統(tǒng)要求對象起始地址必須是8字節(jié)的整數(shù)倍育勺,換句話說光羞,就是對象的大小必須是8字節(jié)的整數(shù)倍。而對象頭部分正好是8字節(jié)的倍數(shù)(一倍或者兩倍)怀大,因此纱兑,當對象實例數(shù)據(jù)部分沒有對齊時,就需要通過對齊填充來補全化借。