1. 程式人生 > 其它 >java計算一個例項物件佔用空間大小的方法分享

java計算一個例項物件佔用空間大小的方法分享

轉自:http://www.java265.com/JavaJingYan/202110/16349927561557.html

下文筆者將講述一個java物件佔用空間大小的方法分享,如下所示:

物件頭

一個物件頭部至少有兩個WORD
如果物件是陣列,則需要三個WORD,如下:

  1. 物件的HashCode,鎖資訊
  2. 物件型別資料的指標
  3. 陣列的長度(物件為陣列)

計算規則

在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