1.概述
在一些博客中说java的内存布局是分为3个部分的,那么我们怎么确认这个呢?或者如何打印java 对象的内存布局呢?
下面介绍可以使用这个类
首先引入这个包
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.10</version>
</dependency>
然后,创建一个类
public class L {
private boolean flag = false;
}
然后测试类如下
@Test
public void printAble(){
L l = new L();
System.out.println(ClassLayout.parseInstance(l).toPrintable());
}
可以看到如下
com.java.lock.obj.head.L 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) a3 1c 01 f8 (10100011 00011100 00000001 11111000) (-134144861)
12 1 boolean L.flag false
13 3 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total
这里分析,可以看到 3个object header
每个占用4个字节,然后下面是boolean占用一个字节,这些总共 3*4+1=13个字节,因为java 要求对象
- 至少8个字节
- 对象必须是8的整数倍
因此最后3个字节是对象对齐的。
下面验证一下,我们创建一个类,但是是Int类型。
public class L {
private int flag ;
}
然后运行测试类,打印如下
@Test
public void printAble(){
L l = new L();
System.out.println(ClassLayout.parseInstance(l).toPrintable());
}
可以看到如下
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) a3 1c 01 f8 (10100011 00011100 00000001 11111000) (-134144861)
12 4 int In.flag 0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
正好int占用4个字节,然后结果正好16个字节,8的倍数,所以没有对象补齐操作。