對(duì)象結(jié)構(gòu)

image.png

對(duì)象在內(nèi)存中存儲(chǔ)的布局可以分為3塊區(qū)域:對(duì)象頭(Header)、實(shí)例數(shù)據(jù)(Instance Data)和對(duì)齊填充(Padding)。下圖是普通對(duì)象實(shí)例與數(shù)組對(duì)象實(shí)例的數(shù)據(jù)結(jié)構(gòu):

對(duì)象頭

1.markword
第一部分markword,用于存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù),如哈希碼(HashCode)、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向線程ID、偏向時(shí)間戳等,這部分?jǐn)?shù)據(jù)的長(zhǎng)度在32位和64位的虛擬機(jī)(未開啟壓縮指針)中分別為32bit和64bit,官方稱它為“MarkWord”。
2.klass
對(duì)象頭的另外一部分是klass類型指針,即對(duì)象指向它的類元數(shù)據(jù)的指針,虛擬機(jī)通過這個(gè)指針來(lái)確定這個(gè)對(duì)象是哪個(gè)類的實(shí)例.
3.數(shù)組長(zhǎng)度(只有數(shù)組對(duì)象有)
如果對(duì)象是一個(gè)數(shù)組, 那在對(duì)象頭中還必須有一塊數(shù)據(jù)用于記錄數(shù)組長(zhǎng)度.

實(shí)例數(shù)據(jù)

實(shí)例數(shù)據(jù)部分是對(duì)象真正存儲(chǔ)的有效信息,也是在程序代碼中所定義的各種類型的字段內(nèi)容。無(wú)論是從父類繼承下來(lái)的,還是在子類中定義的,都需要記錄起來(lái)。

對(duì)齊填充

第三部分對(duì)齊填充并不是必然存在的,也沒有特別的含義,它僅僅起著占位符的作用。由于HotSpot VM的自動(dòng)內(nèi)存管理系統(tǒng)要求對(duì)象起始地址必須是8字節(jié)的整數(shù)倍,換句話說(shuō),就是對(duì)象的大小必須是8字節(jié)的整數(shù)倍。而對(duì)象頭部分正好是8字節(jié)的倍數(shù)(1倍或者2倍),因此,當(dāng)對(duì)象實(shí)例數(shù)據(jù)部分沒有對(duì)齊時(shí),就需要通過對(duì)齊填充來(lái)補(bǔ)全。

對(duì)象大小計(jì)算

要點(diǎn)
1. 在32位系統(tǒng)下,存放Class指針的空間大小是4字節(jié),MarkWord是4字節(jié),對(duì)象頭為8字節(jié)。
2. 在64位系統(tǒng)下,存放Class指針的空間大小是8字節(jié),MarkWord是8字節(jié),對(duì)象頭為16字節(jié)。
3. 64位開啟指針壓縮的情況下,存放Class指針的空間大小是4字節(jié),MarkWord是8字節(jié),對(duì)象頭為12字節(jié)。 數(shù)組長(zhǎng)度4字節(jié)+數(shù)組對(duì)象頭8字節(jié)(對(duì)象引用4字節(jié)(未開啟指針壓縮的64位為8字節(jié))+數(shù)組markword為4字節(jié)(64位未開啟指針壓縮的為8字節(jié)))+對(duì)齊4=16字節(jié)。
4. 靜態(tài)屬性不算在對(duì)象大小內(nèi)。

最后編輯于
?著作權(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ù)。

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