JOL全稱為Java Object Layout,是分析JVM中對象布局的工具
java對象的組成部分:
- 1.對象頭
在jvm虛擬機中每一個java對象都有一個對象頭,對象頭中包含標記字段以及對象指針,標記字段用來儲存hash碼、gc信息以及鎖信息,而指針則指向改對象的類。在64位jvm虛擬機中這兩部分都是64位的,所以也就是需要128位大小(16 bytes)。
注意:64位虛擬機中在堆內存小於32GB的情況下,UseCompressedOops是默認開啟的,該參數表示開啟指針壓縮,會將原來64位的指針壓縮為32位。 - 2.實例數據
類中所有的實例字段數據。 - 3.內存填充部分(alignment)
該部分作用是用來保證java對象在虛擬機中占內存大小為8N bytes。 - 4.數組長度
這個是數組對象才特有的。
java的基礎數據類型所占內存情況如下表格:
boolean | byte | short | char | int | long | float | double |
---|---|---|---|---|---|---|---|
1 bytes | 1 bytes | 2 bytes | 2 bytes | 4 bytes | 8 bytes | 4 bytes | 8 bytes |
要使用JOL工具,先引入依賴:
<!--Java Object Layout --> <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.11</version> </dependency>
測試代碼如下:
public class TestJOL { public static void main(String[] args) { Object o = new Object(); System.out.println(ClassLayout.parseInstance(o).toPrintable()); } }
運行結果:
java.lang.Object object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243) 12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
從運行結果可以看到一個Object對象實例在內存中占16字節。