JAVA對象內(nèi)存布局

在HotSpot虛擬機(jī)中坐搔,一個對象內(nèi)部分為三個區(qū)域:對象頭(Header)、實(shí)例數(shù)據(jù)(Instance Data)敬矩、對齊填充(Padding)概行。


對象內(nèi)部結(jié)構(gòu)

對象頭

對象頭內(nèi)部又分為三部分:標(biāo)記字(Mark Word)、類型指針(Class Pointer)弧岳、數(shù)組長度(數(shù)組類型的對象才有)凳忙。

  • 標(biāo)記字:用于存儲對象自身的運(yùn)行時數(shù)據(jù),如:HashCode禽炬、GC分代年齡涧卵、鎖狀態(tài)標(biāo)志、線程持有的鎖瞎抛、偏向線程ID艺演、偏向時間戳等。32位JVM中Mark Word大小為4字節(jié)(Byte)桐臊,64位JVM中為8字節(jié)胎撤。
  • 類型指針:是對象指向它的類元數(shù)據(jù)的指針(即元空間中該類的內(nèi)存地址),虛擬機(jī)通過這個指針來確定這個對象是哪個類的實(shí)例断凶。32位JVM中Class Pointer大小為4字節(jié)伤提,64位JVM中為8字節(jié)。從JDK6 update14開始认烁,64位JVM便正式支持了-XX:+UseCompressedOops這個參數(shù)(默認(rèn)開啟)肿男,可以壓縮類型指針的大小為4字節(jié),起到節(jié)約內(nèi)存占用的目的却嗡。
  • 數(shù)組長度:數(shù)組的長度舶沛,非數(shù)組對象則沒有這部分。32位和64位JVM中數(shù)組長度大小都為4字節(jié)窗价。

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

對象的成員變量如庭,包括父類中定義的成員變量『掣郏基本類型成員變量占內(nèi)存大衅核:boolean和byte(1字節(jié))、short和char(2字節(jié))帝牡、int和float(4字節(jié))往毡、long和double(8字節(jié))。非基本類型的成員變量存放的是各個成員變量在堆或元空間中的內(nèi)存地址靶溜,32位JVM中大小為4字節(jié)开瞭,64位JVM中關(guān)閉指針壓縮時為8字節(jié)懒震,開啟指針壓縮時為4字節(jié)。

對齊填充

由于虛擬機(jī)要求對象起始地址必須是8字節(jié)的整數(shù)倍惩阶,所以當(dāng)對象頭和實(shí)例數(shù)據(jù)的大小之和不是8字節(jié)的整數(shù)倍時挎狸,就會有對齊填充部分,用于字節(jié)對齊断楷。

計(jì)算對象大小

Object o = new Object();

這樣一個沒有任何成員變量的對象锨匆,占多少內(nèi)存?

  • 32位:Mark Word(4B) + Class Pointer(4B) + ArrayLength(0B) + Instance Data(0B) + Padding(0B) = 8B
  • 64位關(guān)閉壓縮類型指針:Mark Word(8B) + Class Pointer(8B) + ArrayLength(0B) + Instance Data(0B) + Padding(0B) = 16B
  • 64位開啟壓縮類型指針:Mark Word(8B) + Class Pointer(4B) + ArrayLength(0B) + Instance Data(0B) + Padding(4B) = 16B

借助JOL(JAVA Object Layout)工具冬筒,可以直觀地觀察JAVA對象的內(nèi)部結(jié)構(gòu)恐锣,以下測試均在64位JVM上運(yùn)行。
首先添加依賴:

    <dependency>
      <groupId>org.openjdk.jol</groupId>
      <artifactId>jol-core</artifactId>
      <version>0.11</version>
    </dependency>

運(yùn)行示例代碼:

import org.openjdk.jol.info.ClassLayout;

public class TestJol {

  public static void main(String[] args) {
    Object o = new Object();
    System.out.println(ClassLayout.parseInstance(o).toPrintable());
  }
}

程序輸出:

java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

前兩行是Mark Word舞痰,共8字節(jié)土榴,第三行是類型指針,4字節(jié)响牛,第四行是填充對齊玷禽,4字節(jié)。
關(guān)閉類型指針壓縮(-XX:-UseCompressedOops)后再次運(yùn)行呀打,程序輸出:

java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           00 1c 83 1b (00000000 00011100 10000011 00011011) (461577216)
     12     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

可以看出兩種情況下矢赁,該對象占用的內(nèi)存大小(Instance size)都是16字節(jié)贬丛,區(qū)別在于關(guān)閉類型指針壓縮后撩银,類型指針的大小變成了8字節(jié),相應(yīng)的對象頭的大小變成了16字節(jié)豺憔,整個對象的大小也是16字節(jié)额获,剛好是8的整數(shù)倍,所以沒有了填充對齊的空間恭应。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抄邀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昼榛,更是在濱河造成了極大的恐慌撤摸,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褒纲,死亡現(xiàn)場離奇詭異,居然都是意外死亡钥飞,警方通過查閱死者的電腦和手機(jī)莺掠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來读宙,“玉大人彻秆,你說我怎么就攤上這事。” “怎么了唇兑?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵酒朵,是天一觀的道長。 經(jīng)常有香客問我扎附,道長蔫耽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任留夜,我火速辦了婚禮匙铡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碍粥。我一直安慰自己鳖眼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布嚼摩。 她就那樣靜靜地躺著钦讳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枕面。 梳的紋絲不亂的頭發(fā)上愿卒,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音膊畴,去河邊找鬼掘猿。 笑死,一個胖子當(dāng)著我的面吹牛唇跨,可吹牛的內(nèi)容都是我干的稠通。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼买猖,長吁一口氣:“原來是場噩夢啊……” “哼改橘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起玉控,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤飞主,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后高诺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碌识,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年虱而,在試婚紗的時候發(fā)現(xiàn)自己被綠了筏餐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡牡拇,死狀恐怖魁瞪,靈堂內(nèi)的尸體忽然破棺而出穆律,到底是詐尸還是另有隱情,我是刑警寧澤导俘,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布峦耘,位于F島的核電站,受9級特大地震影響旅薄,放射性物質(zhì)發(fā)生泄漏辅髓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一赋秀、第九天 我趴在偏房一處隱蔽的房頂上張望利朵。 院中可真熱鬧,春花似錦猎莲、人聲如沸绍弟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽樟遣。三九已至,卻和暖如春身笤,著一層夾襖步出監(jiān)牢的瞬間豹悬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工液荸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞻佛,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓娇钱,卻偏偏與公主長得像伤柄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子文搂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容