Jol 是分析和学习Java很好的工具
maven 依赖
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.17</version>
</dependency>
来个简单的例子
@org.junit.jupiter.api.Test
public void objLen() {
Object obj = new Object();
System.out.println(ClassLayout.parseInstance(obj).toPrintable());
Object[] objArr = new Object[]{obj};
System.out.println(ClassLayout.parseInstance(objArr).toPrintable());
String a = "a";
System.out.println(ClassLayout.parseInstance(a).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
[Ljava.lang.Object; object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf800234c
12 4 (array length) 1
16 4 java.lang.Object Object;.<elements> N/A
20 4 (object alignment gap)
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
java.lang.String object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf80002da
12 4 char[] String.value [a]
16 4 int String.hash 0
20 4 (object alignment gap)
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total