版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 統(tǒng)編版2025-2026學(xué)年語文四年級(jí)第一學(xué)期期末質(zhì)量檢測練習(xí)卷(含答案)
- 湖南省岳陽市汨羅市2025-2026學(xué)年八年級(jí)上學(xué)期1月期末生物試題(無答案)
- 河南省駐馬店市泌陽縣2025-2026學(xué)年八年級(jí)上學(xué)期1月期末考試歷史試卷答案
- 2025-2026學(xué)年一年級(jí)(上)期末游戲化測試語文試卷(附參考答案)
- 五年級(jí)題目及答案
- 文件筐測試題及答案
- 2026年小學(xué)語文模擬沖刺押題卷
- 誠實(shí)做事的演講稿
- 冀教版三年級(jí)上冊數(shù)學(xué)第二單元-兩、三位數(shù)乘一位數(shù)-測試卷及答案(奪冠系列)
- 高中高二下學(xué)期地理期末考試試題答案解析
- 2026廣東廣州市海珠區(qū)住房和建設(shè)局招聘雇員7人筆試參考題庫及答案解析
- 云南師大附中2026屆高三1月高考適應(yīng)性月考卷英語(六)含答案
- 海南2025年中國熱帶農(nóng)業(yè)科學(xué)院橡膠研究所第一批招聘16人(第1號(hào))筆試歷年參考題庫附帶答案詳解
- 2025-2026人教版數(shù)學(xué)七年級(jí)上冊期末模擬試卷(含答案)
- 2026年九江市八里湖新區(qū)國有企業(yè)面向社會(huì)公開招聘工作人員【48人】筆試參考題庫及答案解析
- 廣告行業(yè)法律法規(guī)與行業(yè)規(guī)范(標(biāo)準(zhǔn)版)
- 2025年CFA二級(jí)道德與專業(yè)標(biāo)準(zhǔn)題
- 2026年鄭州電力高等專科學(xué)校單招職業(yè)技能測試題庫新版
- 2026年八年級(jí)物理上冊期末考試試卷及答案(共四套)
- 節(jié)能與新能源汽車技術(shù)路線圖2.0
- 保育員配合教學(xué)培訓(xùn)工作指南
評論
0/150
提交評論