java計算一個例項物件佔用空間大小的方法分享
阿新 • • 發佈:2021-10-23
轉自: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