1. 程式人生 > 其它 >Java普通物件記憶體佈局

Java普通物件記憶體佈局

一個普通物件,在記憶體中佔多大?

普通物件在記憶體中主要分三部分組成

  1. 物件頭:物件頭分markwork和classpointer組成,markword主要存放標記位,classpointer用來存放型別指標
  2. 物件資料:這裡主要存放的是指標的地址
  3. 對齊填充:hotspot規定,物件的起始地址佔用記憶體大小必須為8的整倍數,不足的話,要補齊

這個記憶體佔用大小還跟機器的位數(32或64位)、是否開啟指標壓縮(-XX:-UseCompressedOops)有關,下面舉例:

  1. 引入jar包

JOL,全程Java Object Layout,Java物件佈局

<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.16</version>
</dependency>
  1. 測試程式碼(開啟指標壓縮)
public static class TTT {
    
}

public static void main(String[] args) {
    TTT ttt = new TTT();
    String str = ClassLayout.parseInstance(ttt).toPrintable();
    System.out.println(str);
}

測試結果:

OFF  SZ               TYPE DESCRIPTION               VALUE
  0   8                    (object header: mark)     0x0000000000000001 (non-biasable; age: 0)
  8   4                    (object header: class)    0xf800c147
 12   4   java.lang.String TTT.a                     null
Instance size: 16 bytes

mark:佔用了8個位元組,class指標佔用了4個,String例項指標佔用了4個,沒有對齊,一共佔用了16個位元組

  1. 測試程式碼(關閉指標壓縮)
OFF  SZ               TYPE DESCRIPTION               VALUE
  0   8                    (object header: mark)     0x0000000000000001 (non-biasable; age: 0)
  8   8                    (object header: class)    0x00000001260650e0
 16   8   java.lang.String TTT.a                     null
Instance size: 24 bytes

mark:佔用了8個,class指標佔用了8個,String例項指標佔用了8個,沒有對齊,一共24個位元組