轉自:http://www.java265.com/JavaJingYan/202110/16349927561557.html
下文筆者将講述一個java對象占用空間大小的方法分享,如下所示:
對象頭
一個對象頭部至少有兩個WORD
如果對象是數組,則需要三個WORD,如下:
- 對象的HashCode,鎖資訊
- 對象類型資料的指針
- 數組的長度(對象為數組)
計算規則
在Java代碼中,任何對象都是8位元組對齊
屬性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的順序存放
例:
public class Test {
byte a;
int b;
boolean c;
long d;
Object e;
}
當一個對象的屬性按照以上順序存儲,
則其占用空間為
head(8) + a(1) + padding(3) + b(4) + c(1) + padding(7) + d(8) + e(4) + padding(4) = 40
如果按照這個規則得到:head(8) + d(8) + b(4) + a(1) + c(1) + padding(2) + e(4) + padding(4) = 32
可以解決很多空間
在涉及繼承關系時, 則我們會按照一個基本的原則, 先放父類中的成員 然後再放入子類中的成員 例:
class A {
long a;
int b;
int c;
}
class B extends A {
long d;
}
按照以上規則的存儲空間大小為:
head(8) + a(8) + b(4) + c(4) + d(8) = 32
當父類中的屬性不夠八個位元組時,
父類中最後一個成員與子類的第一個成員的間隔如果不夠4個位元組,
此時需要擴充到4個位元組的基本機關
例:
class A {
byte a;
}
class B extends A {
byte b;
}
占用大小為:
head(8) + a(1) + padding(3) + b(1) + padding(3) = 16
-------------------------------------------------------
當子類的第一個成員是double或long
且父類未用完8個位元組
JVM會破壞規将較小的資料填充到該空間
class A {
byte a;
}
class B extends A {
long b;
short c;
byte d;
}
按照以上的占用空間大小為:
head(8) + a(1) + padding(3) + c(2) + d(1) + padding(1) + b(8) = 24