JOL介绍
JOL可以查看java对象的内部布局,也可以查看对象占用的空间。
如何使用
Maven引入JOL依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.16</version>
</dependency>
</dependencies>
编写代码查看对象结构
public static void main(String[] args) {
Object obj = new Object();
System.out.println(ClassLayout.parseInstance(obj).toPrintable());
byte[] objArr = new byte[100];
System.out.println(ClassLayout.parseInstance(objArr).toPrintable());
}
输出结果:
java.lang.Object object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf80001e5
12 4 (object alignment gap)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
[B object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf80000f5
12 4 (array length) 100
12 4 (alignment/padding gap)
16 100 byte [B.<elements> N/A
116 4 (object alignment gap)
Instance size: 120 bytes
Space losses: 4 bytes internal + 4 bytes external = 8 bytes total
结果说明:
(object header: mark)
就是Java对象头中的Mark Word部分,因为是在64位机器上执行的,所以占用8字节。64位机器上1个字宽等于64bit,也就是4个字节,Java对象头占用2个字宽。(object header: class)
存储到对象类型数据的指针。(array length)
存储数组的长度。如果对象是数组,对象头会占用3个字宽。(普通对象的对象头占用2个字宽。)