Java普通物件記憶體佈局
阿新 • • 發佈:2022-05-09
一個普通物件,在記憶體中佔多大?
普通物件在記憶體中主要分三部分組成
- 物件頭:物件頭分markwork和classpointer組成,markword主要存放標記位,classpointer用來存放型別指標
- 物件資料:這裡主要存放的是指標的地址
- 對齊填充:hotspot規定,物件的起始地址佔用記憶體大小必須為8的整倍數,不足的話,要補齊
這個記憶體佔用大小還跟機器的位數(32或64位)、是否開啟指標壓縮(-XX:-UseCompressedOops)有關,下面舉例:
- 引入jar包
JOL,全程Java Object Layout,Java物件佈局
<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.16</version> </dependency>
- 測試程式碼(開啟指標壓縮)
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個位元組
- 測試程式碼(關閉指標壓縮)
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個位元組