Java對象的內(nèi)存布局全流程_第1頁
Java對象的內(nèi)存布局全流程_第2頁
Java對象的內(nèi)存布局全流程_第3頁
Java對象的內(nèi)存布局全流程_第4頁
Java對象的內(nèi)存布局全流程_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第Java對象的內(nèi)存布局全流程目錄對象內(nèi)存布局對象占用內(nèi)存空間證明對象內(nèi)存布局開始先拋出一個(gè)問題:一個(gè)對象o,Objecto=newObject();創(chuàng)建完成后會(huì)占用多少字節(jié)的內(nèi)存?

要能回答這個(gè)問題,就需要了解java對象的內(nèi)存布局。

對象內(nèi)存布局

一個(gè)Java對象在內(nèi)存中包括對象頭、實(shí)例數(shù)據(jù)和對齊填充三個(gè)部分。如下圖所示:

對象頭

MarkWord:包含一系列的標(biāo)記位比如hashcode、GC分代年齡、偏向鎖位,鎖標(biāo)志位等。這個(gè)MarkWord在對象被加了不同量級(jí)的鎖時(shí)所包含的內(nèi)容和布局都有所不同,這涉及到鎖升級(jí)的知識(shí),暫不展開討論KlassPointer:是一個(gè)指針,指向描述這個(gè)對象類型的元對象,例如Object.class,User.class等

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

instancedata:描述成員變量的信息,如果成員變量是引用類型,那么它就是一個(gè)指針。instancedata的大小是所有成員變量的占用空間(基本數(shù)據(jù)類型大小+指針大小)

對齊

padding:在java中,為了能夠更加高效的利用內(nèi)存空間,會(huì)將對象大小設(shè)定為8bytes的整數(shù)倍,如果對象頭+實(shí)例數(shù)據(jù)的大小不是8bytes的倍數(shù),那么會(huì)在padding區(qū)域填充幾個(gè)字節(jié),使得對象占用空間是8bytes的倍數(shù)

那么對象布局中各個(gè)部分占用內(nèi)存空間到底多大呢?

對象占用內(nèi)存空間

由于目前64位操作系統(tǒng)已經(jīng)基本普及,下面只分析64位操作系統(tǒng)下的情況

指針壓縮

在64位系統(tǒng)中,一個(gè)指針占64bits也就是8bytes,而在32位系統(tǒng)中指針只占4個(gè)字節(jié),于是為了能夠減少內(nèi)存消耗,從JDK1.6開始,JVM會(huì)默認(rèn)支持指針壓縮,會(huì)將指針大小壓縮成4個(gè)字節(jié),

這涉及到兩個(gè)參數(shù)-XX:+UseCompressedOops,-XX:+UseCompressedClassPointers。

UseCompressedOops:oops:ordinaryobjectpointer,普通對象指針壓縮,例如Objecto=newObject();其中o就是個(gè)指向newObject()對象的指針,o在指針壓縮前占用8個(gè)字節(jié),在指針壓縮后占用4個(gè)字節(jié)UseCompressedClassPointers:壓縮KlassPointer,壓縮前8個(gè)字節(jié),壓縮后4個(gè)字節(jié)

對象頭

MarkWord占8個(gè)字節(jié)

KlassPointer:開啟(默認(rèn))壓縮4個(gè)字節(jié),不開啟壓縮8個(gè)字節(jié)

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

instancedata:根據(jù)實(shí)際情況計(jì)算:如果成員變量是基本數(shù)據(jù)類型,那么占用空間就是基本數(shù)據(jù)類型的大小,Java的8大基本數(shù)據(jù)類型的大小如下:

數(shù)據(jù)類型占用空間bytesbyte1short2int4long8float4double8char2boolean1

如果成員變量是引用類型,那么就是一個(gè)指針大?。ㄩ_啟指針壓縮占4字節(jié),不開啟指針壓縮8字節(jié))

對齊

padding:如果對象頭+實(shí)例數(shù)據(jù)的大小不是8bytes的倍數(shù),那么就填充這個(gè)區(qū)域,使得對象占用空間能被8個(gè)字節(jié)整除(最小情況)

口說無憑,下面將會(huì)通過實(shí)驗(yàn)證明

證明對象內(nèi)存布局

我們需要引用一個(gè)依賴:openjdk提供的jol-core:

dependency

groupIdorg.openjdk.jol/groupId

artifactIdjol-core/artifactId

version0.9/version

/dependency

1.查看默認(rèn)情況下沒有成員變量的對象布局

示例代碼:

publicclassTestObj{

publicstaticvoidmain(String[]args){

//創(chuàng)建對象

Objecto=newObject();

//獲得對象布局內(nèi)容

Strings=ClassLayout.parseInstance(o).toPrintable();

//打印對象布局

System.out.println(s);

輸出結(jié)果:

其中對象頭(objectheader)有三個(gè),前兩個(gè)是MarkWord一共8個(gè)字節(jié),后面一個(gè)是KlassPointer,占4個(gè)字節(jié),由于沒有成員變量,所以實(shí)例數(shù)據(jù)沒有占用空間,而最后4個(gè)字節(jié)描述信息為:lossduetothenextobjectalignment,意思就是為了與下一個(gè)對象對齊而丟失的部分,也就是對齊填充空間

2.證明KlassPointer在不開啟壓縮的情況下占用8個(gè)字節(jié)

我們只需要在jvm參數(shù)上加上-XX:-UseCompressedClassPointers即可,在IDEA工具中可以設(shè)置啟動(dòng)參數(shù):

還是運(yùn)行上述代碼,運(yùn)行程序結(jié)果:

如上圖所示,對象頭已經(jīng)占用16個(gè)字節(jié),前8個(gè)字節(jié)是MarkWord,后8個(gè)字節(jié)就是未壓縮的KlassPointer。我們還注意到對齊填充也沒有了,原因是此時(shí)對象占用空間16個(gè)字節(jié)已經(jīng)是8bytes的倍數(shù),所以不需要填充,這完全印證了前面的分析

3.證明實(shí)例數(shù)據(jù)的存在以及大小

示例代碼:

publicclassTestObj{

publicstaticvoidmain(String[]args){

//創(chuàng)建對象

Useruser=newUser(1,"zhangsan");

//獲得對象布局內(nèi)容

Strings=ClassLayout.parseInstance(user).toPrintable();

//打印對象布局

System.out.println(s);

classUser{

privateintid;

privateStringname;

publicUser(intid,Stringname){

this.id=id;

=name;

打印結(jié)果:

如上圖所示,int類型的id占用4個(gè)字節(jié),指向字符串對象的name指針占用4個(gè)字節(jié),加上對齊,對象一共占用24bytes

4.最后驗(yàn)證不開啟指針壓縮的情況下指針占用8bytes

只需在jvm參數(shù)上加上-XX:-UseCompressedOops:

還是運(yùn)行上面的代碼,打印結(jié)果:

很顯然,此時(shí)name指針已經(jīng)占用了8個(gè)字節(jié)

一般來說,UseCompressedClassPointers和UseCompressedOops是默認(rèn)開啟的,我們無需關(guān)心也無需修改。但是有個(gè)隱藏的細(xì)節(jié)就是:UseCompressedClassPointers的開啟依賴UseCompressedOops的開啟,并且開啟UseCompressedOops也默認(rèn)強(qiáng)制開啟UseCompressed

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論