天天看點

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