您好,登錄后才能下訂單哦!
這篇文章給大家介紹Java中怎么計算對象占用空間,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
對象頭
對象的頭部至少有兩個WORD,如果是數(shù)組的話,那么三個WORD,內(nèi)容如下:
對象的HashCode,鎖信息等到對象類型數(shù)據(jù)的指針數(shù)組的長度(如果是數(shù)組的話)
規(guī)則
首先,任何對象都是8字節(jié)對齊,屬性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的順序存放,舉個例子:
publicclassTest{
bytea;
intb;
booleanc;
longd;
Objecte;
}
如果這個對象的屬性按照順序存放的話,要占用的空間為:head(8)+a(1)+padding(3)+b(4)+c(1)+padding(7)+d(8)+e(4)+padding(4)=40。但是按照這個規(guī)則得到:head(8)+d(8)+b(4)+a(1)+c(1)+padding(2)+e(4)+padding(4)=32。可以看到節(jié)省了不少空間。
在涉及繼承關(guān)系的時候有一個最基本的規(guī)則:首先存放父類中的成員,接著才是子類中的成員,舉個例子:
classA{
longa;
intb;
intc;
}
classBextendsA{
longd;
}
這樣存放的順序及占用空間如下:head(8)+a(8)+b(4)+c(4)+d(8)=32。那如果父類中的屬性不夠八個字節(jié)怎么辦?這樣就有了新的一條規(guī)則:父類中最后一個成員與子類的第一個成員的間隔如果不夠4個字節(jié),此時需要擴(kuò)展到4個字節(jié)的基本單位,舉個例子:
classA{
bytea;
}
classBextendsA{
byteb;
}
那么此時占用的空間如下:head(8)+a(1)+padding(3)+b(1)+padding(3)=16。顯然這種方式比較浪費(fèi)空間,那么就有了:如果子類的第一個成員是double或者long,并且父類并沒有用完8個字節(jié),JVM會破壞規(guī)將較小的數(shù)據(jù)填充到該空間,舉個例子:
classA{
bytea;
}
classBextendsA{
longb;
shortc;
byted;
}
此時占用的空間如下:head(8)+a(1)+padding(3)+c(2)+d(1)+padding(1)+b(8)=24。
關(guān)于Java中怎么計算對象占用空間就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。