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

  • 對象在內(nèi)存中的存儲可以分為三個區(qū)域:對象頭(Header)默怨,實例數(shù)據(jù)(Instance Data)和對齊填充(Padding)码撰。

頭對象

  • 對于不同的對象類型疯特,虛擬機存儲的長度也不同。如果對象是數(shù)組類型眉枕,則虛擬機用3個字寬存儲對象頭械哟,如果對象是非數(shù)組類型疏之,則用2字寬存儲對象頭。在32位虛擬機中戒良,1字寬等于4字節(jié)体捏,既32bit。入下圖所示:

    長度 內(nèi)容 說明
    32/64bit Mark Word 存儲對象的hashcode和鎖信息等
    32/64bit Class MetaData Address 存儲到對象類型數(shù)據(jù)的指針
    32/64bit Array length 數(shù)組長度(如果當(dāng)前是數(shù)組)

Mark Word

  • Mark Word存儲的是對象自身的運行數(shù)據(jù)糯崎,如哈希碼,GC分代年齡河泳,鎖狀態(tài)標(biāo)記沃呢,偏向鎖ID,偏向時間戳等拆挥。

  • 由于32bit薄霜,64bit儲存的數(shù)據(jù)不夠多,為了存儲更多信息纸兔,Mark Word被設(shè)計成非固定的存儲結(jié)構(gòu)惰瓜,其存儲的數(shù)據(jù)會隨著鎖標(biāo)志位的變化而變化。

  • 32bit虛擬機中的Mark Word存儲結(jié)構(gòu)

    image
  • 64bit虛擬機中的Mark Word存儲結(jié)構(gòu)

    image
  • 輕量級鎖和偏向鎖是Java 6 對 synchronized 鎖進行優(yōu)化后新增加的汉矿,這里并不進行詳細介紹崎坊。

類型指針

  • 用來指向?qū)ο髮?yīng)的Class對象(其對應(yīng)的元數(shù)據(jù)對象)的內(nèi)存地址。在32位系統(tǒng)占4字節(jié)洲拇,在64位系統(tǒng)中占8字節(jié)奈揍;

Array Length

  • 如果對象是個數(shù)組的話曲尸,對象頭中就必須要有一塊用于記錄數(shù)組長度的數(shù)據(jù),不然虛擬機無法確定數(shù)組的大小男翰。32位的JVM上另患,長度為32位;64位JVM則為64位蛾绎。64位JVM如果開啟+UseCompressedOops選項(開啟指針壓縮)潭袱,該區(qū)域長度也將由64位壓縮至32位。32位HotSpot VM是不支持UseCompressedOops參數(shù)的吨些,只有64位HotSpot VM才支持痢畜。

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

  • 實例數(shù)據(jù)是對象真正存儲的有效信息,也是在程序代碼中所定義的各種類型的字段內(nèi)容肺稀。無論是從父類繼承下來的第股,還是自己本身定義的,都要記錄下來话原。
  • 這部分的存儲順序會受到虛擬機分配策略參數(shù)和字段在Java源碼中定義順序的影響夕吻。
  • HotSpot虛擬機默認(rèn)的分配策略為longs/doubles、ints繁仁、shorts/chars涉馅、bytes/booleans、oops(Ordinary Object Pointers)黄虱,從分配策略中可以看出稚矿,相同寬度的字段總是被分配到一起。如果 CompactFields參數(shù)值為true(默認(rèn)為true)捻浦,那子類之中占空間較小的變量也可能會插入到父類變量的空隙之中(JVM按8位對齊)晤揣。

對齊填充

  • 對齊填充并不是必然存在的,也沒有特別的含義朱灿,它僅僅起著占位符的作用昧识。
  • HotSpot VM的自動內(nèi)存管理系統(tǒng)要求對象起始地址必須是8字節(jié)的整數(shù)倍,換句話說就是對象的大小必須是8字節(jié)的整數(shù)倍盗扒。因此跪楞,對于普通對象來說,其對象頭的所占的字節(jié)數(shù)是8的整數(shù)倍(32bit下是1倍侣灶,64bit下是2倍)甸祭。此時則出現(xiàn)在實例數(shù)據(jù)部分可能沒有對齊,就需要對齊填充來補全褥影。假如是數(shù)組對象池户,由于對象頭多了Array Length域,因此可能對象頭也需要對齊填充。

CompressedOops(指針壓縮)

  • 通常64位JVM消耗的內(nèi)存會比32位的最多會多用1.5倍煞檩,這是因為對象指針在64位架構(gòu)下处嫌,對象指針長度會翻倍。 對于那些將要從32位平臺移植到64位的應(yīng)用來說斟湃,平白無辜多了1/2的內(nèi)存占用熏迹,這是開發(fā)者不愿意看到的。從JDK 1.6 update14開始凝赛,64 bit JVM正式支持了 -XX:+UseCompressedOops 這個可以壓縮指針注暗,起到節(jié)約內(nèi)存占用的新參數(shù)。

  • OOP = “ordinary object pointer” 普通對象指針墓猎。 啟用CompressOops后捆昏,會壓縮的對象:

    1. 每個Class的屬性指針(靜態(tài)成員變量)

    2. 每個對象的屬性指針

    3. 普通對象數(shù)組的每個元素指針

  • 壓縮也不是萬能的,針對一些特殊類型的指針毙沾,JVM是不會優(yōu)化的骗卜。 比如指向PermGen的Class對象指針,本地變量左胞,堆棧元素寇仓,入?yún)ⅲ祷刂悼局妫琋ULL指針不會被壓縮遍烦。

  • 原理:32位內(nèi)最多可以表示4GB,64位地址分為堆的基地址+偏移量躺枕,當(dāng)堆內(nèi)存<32GB時候服猪,在壓縮過程中,把偏移量/8后保存到32位地址拐云。在解壓再把32位地址放大8倍罢猪,所以啟用CompressedOops的條件是堆內(nèi)存要在4GB*8=32GB以內(nèi)。

  • 零基壓縮是針對壓解壓動作的進一步優(yōu)化叉瘩。它通過改變正常指針的隨機地址分配特性坡脐,強制從零開始做分配(需要OS支持),進一步提高了壓解壓效率房揭。要啟用零基壓縮,你分配給JVM的內(nèi)存大小必須控制在4G以上晌端,32G以下捅暴。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咧纠,隨后出現(xiàn)的幾起案子蓬痒,更是在濱河造成了極大的恐慌,老刑警劉巖漆羔,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梧奢,死亡現(xiàn)場離奇詭異狱掂,居然都是意外死亡,警方通過查閱死者的電腦和手機亲轨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門趋惨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惦蚊,你說我怎么就攤上這事器虾。” “怎么了蹦锋?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵兆沙,是天一觀的道長。 經(jīng)常有香客問我莉掂,道長葛圃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任憎妙,我火速辦了婚禮库正,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尚氛。我一直安慰自己诀诊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布阅嘶。 她就那樣靜靜地躺著属瓣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讯柔。 梳的紋絲不亂的頭發(fā)上抡蛙,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機與錄音魂迄,去河邊找鬼粗截。 笑死,一個胖子當(dāng)著我的面吹牛捣炬,可吹牛的內(nèi)容都是我干的熊昌。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼湿酸,長吁一口氣:“原來是場噩夢啊……” “哼婿屹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起推溃,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤昂利,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜂奸,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡犁苏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扩所。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片围详。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碌奉,靈堂內(nèi)的尸體忽然破棺而出短曾,到底是詐尸還是另有隱情,我是刑警寧澤赐劣,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布嫉拐,位于F島的核電站,受9級特大地震影響魁兼,放射性物質(zhì)發(fā)生泄漏婉徘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一咐汞、第九天 我趴在偏房一處隱蔽的房頂上張望盖呼。 院中可真熱鬧,春花似錦化撕、人聲如沸几晤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟹瘾。三九已至,卻和暖如春掠手,著一層夾襖步出監(jiān)牢的瞬間憾朴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工喷鸽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留众雷,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓做祝,卻偏偏與公主長得像砾省,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子混槐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

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