玩轉(zhuǎn)JVM中的對(duì)象及引用②:對(duì)象的內(nèi)存布局及訪問(wèn)

一、對(duì)象的內(nèi)存布局

問(wèn):在 Java 對(duì)象創(chuàng)建后,到底是如何被存儲(chǔ)在Java內(nèi)存里的呢?

答:在Java虛擬機(jī)(HotSpot)中,對(duì)象在 Java 內(nèi)存中的 存儲(chǔ)布局 可分為三塊:

  • 對(duì)象頭 存儲(chǔ)區(qū)域
  • 實(shí)例數(shù)據(jù) 存儲(chǔ)區(qū)域
  • 對(duì)齊填充 存儲(chǔ)區(qū)域

①對(duì)象頭 區(qū)域

此處存儲(chǔ)的信息包括兩部分:

  • 對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù)(Mark Word)

如哈希碼(HashCode)、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向線程ID、偏向時(shí)間戳等

該部分?jǐn)?shù)據(jù)被設(shè)計(jì)成1個(gè) 非固定的數(shù)據(jù)結(jié)構(gòu) 以便在極小的空間存儲(chǔ)盡量多的信息(會(huì)根據(jù)對(duì)象狀態(tài)復(fù)用存儲(chǔ)空間)

  • 對(duì)象類型指針

即對(duì)象指向它的類元數(shù)據(jù)的指針

虛擬機(jī)通過(guò)這個(gè)指針來(lái)確定這個(gè)對(duì)象是哪個(gè)類的實(shí)例

特別注意

如果對(duì)象是數(shù)組,那么在對(duì)象頭中還必須有一塊用于記錄數(shù)組長(zhǎng)度的數(shù)據(jù)!

因?yàn)樘摂M機(jī)可以通過(guò)普通Java對(duì)象的元數(shù)據(jù)信息確定對(duì)象的大小,但是從數(shù)組的元數(shù)據(jù)中卻無(wú)法確定數(shù)組的大小。

②實(shí)例數(shù)據(jù) 區(qū)域

存儲(chǔ)的信息:對(duì)象真正有效的信息

即代碼中定義的字段內(nèi)容

注:這部分?jǐn)?shù)據(jù)的存儲(chǔ)順序會(huì)受到虛擬機(jī)分配參數(shù)(FieldAllocationStyle)和字段在Java源碼中定義順序的影響。

// HotSpot虛擬機(jī)默認(rèn)的分配策略如下:
longs/doubles、ints、shorts/chars、bytes/booleans、oop(Ordinary Object Pointers)
// 從分配策略中可以看出,相同寬度的字段總是被分配到一起
// 在滿足這個(gè)前提的條件下,父類中定義的變量會(huì)出現(xiàn)在子類之前
CompactFields = true;
// 如果 CompactFields 參數(shù)值為true,那么子類之中較窄的變量也可能會(huì)插入到父類變量的空隙之中。

③對(duì)齊填充 區(qū)域

存儲(chǔ)的信息:占位符

占位作用

因?yàn)閷?duì)象的大小必須是8字節(jié)的整數(shù)倍,而因HotSpot VM的要求對(duì)象起始地址必須是8字節(jié)的整數(shù)倍,且對(duì)象頭部分正好是8字節(jié)的倍數(shù)。

因此,當(dāng)對(duì)象實(shí)例數(shù)據(jù)部分沒(méi)有對(duì)齊時(shí)(即對(duì)象的大小不是8字節(jié)的整數(shù)倍),就需要通過(guò)對(duì)齊填充來(lái)補(bǔ)全。

總結(jié)

二、對(duì)象的訪問(wèn)定位

問(wèn):建立對(duì)象后,該如何訪問(wèn)對(duì)象呢?

實(shí)際上需訪問(wèn)的是 對(duì)象類型數(shù)據(jù) & 對(duì)象實(shí)例數(shù)據(jù)

答:Java程序 通過(guò) 棧上的引用類型數(shù)據(jù)(reference) 來(lái)訪問(wèn)Java堆上的對(duì)象

由于引用類型數(shù)據(jù)(reference)在 Java虛擬機(jī)中只規(guī)定了一個(gè)指向?qū)ο蟮囊茫珱](méi)定義該引用應(yīng)該通過(guò)何種方式去定位、訪問(wèn)堆中的對(duì)象的具體位置

所以對(duì)象訪問(wèn)方式取決于虛擬機(jī)實(shí)現(xiàn)。目前主流的對(duì)象訪問(wèn)方式有兩種:

  • 句柄 訪問(wèn)
  • 直接指針 訪問(wèn)

具體請(qǐng)看如下介紹:

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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