Java中怎么計(jì)算對(duì)象占用空間-創(chuàng)新互聯(lián)
這篇文章給大家介紹Java中怎么計(jì)算對(duì)象占用空間,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
對(duì)象頭
對(duì)象的頭部至少有兩個(gè)WORD,如果是數(shù)組的話,那么三個(gè)WORD,內(nèi)容如下:
對(duì)象的HashCode,鎖信息等到對(duì)象類型數(shù)據(jù)的指針數(shù)組的長(zhǎng)度(如果是數(shù)組的話)
規(guī)則
首先,任何對(duì)象都是8字節(jié)對(duì)齊,屬性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的順序存放,舉個(gè)例子:
publicclassTest{
bytea;
intb;
booleanc;
longd;
Objecte;
}
如果這個(gè)對(duì)象的屬性按照順序存放的話,要占用的空間為:head(8)+a(1)+padding(3)+b(4)+c(1)+padding(7)+d(8)+e(4)+padding(4)=40。但是按照這個(gè)規(guī)則得到:head(8)+d(8)+b(4)+a(1)+c(1)+padding(2)+e(4)+padding(4)=32。可以看到節(jié)省了不少空間。
在涉及繼承關(guān)系的時(shí)候有一個(gè)最基本的規(guī)則:首先存放父類中的成員,接著才是子類中的成員,舉個(gè)例子:
classA{
longa;
intb;
intc;
}
classBextendsA{
longd;
}
這樣存放的順序及占用空間如下:head(8)+a(8)+b(4)+c(4)+d(8)=32。那如果父類中的屬性不夠八個(gè)字節(jié)怎么辦?這樣就有了新的一條規(guī)則:父類中最后一個(gè)成員與子類的第一個(gè)成員的間隔如果不夠4個(gè)字節(jié),此時(shí)需要擴(kuò)展到4個(gè)字節(jié)的基本單位,舉個(gè)例子:
classA{
bytea;
}
classBextendsA{
byteb;
}
那么此時(shí)占用的空間如下:head(8)+a(1)+padding(3)+b(1)+padding(3)=16。顯然這種方式比較浪費(fèi)空間,那么就有了:如果子類的第一個(gè)成員是double或者long,并且父類并沒有用完8個(gè)字節(jié),JVM會(huì)破壞規(guī)將較小的數(shù)據(jù)填充到該空間,舉個(gè)例子:
classA{
bytea;
}
classBextendsA{
longb;
shortc;
byted;
}
此時(shí)占用的空間如下:head(8)+a(1)+padding(3)+c(2)+d(1)+padding(1)+b(8)=24。
關(guān)于Java中怎么計(jì)算對(duì)象占用空間就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
網(wǎng)站欄目:Java中怎么計(jì)算對(duì)象占用空間-創(chuàng)新互聯(lián)
文章源于:http://www.xueling.net.cn/article/cdcgcp.html