如何查看对象的内存布局
- 工具:Java Object Layout(jol)
- 地址 mvnrepository.com/artifact/or…
jol打印出来的信息详情
下面两行代码,打印一个Object在内存中的信息
Object obj = new Object();
System.out.println(ClassLayout.parseInstance(obj).toPrintable());
输出如下图:
可以分为3个部分
- 对象头
- Mark Word:第一个红框,存储对象的HashCode、GC 分代年龄(4字节,二进制最大值1111,十进制就是15)、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳
- 类型指针(Class Pointer):第二个红框,指向Class对象(在32位系统上4字节,在64位系统上8字节,开启指针压缩后在64位系统上4字节,默认开启指针压缩)
- 实例数据:因为Object里面没有别的属性,所以这里没有打印出来
- 对齐填充(Padding):第三个红框,使对象大小达到8的整数倍 所以大小就是 对象头+实例数据+对齐,即(8+4)+0+4=16字节
自定义类在内存中的信息详情
//定义一个类
public static class TestObject{
int a;
int b = 1;
TestObject o;
}
//打印TestObject
TestObject objTest = new TestObject();
System.out.println(ClassLayout.parseInstance(objTest).toPrintable());
输出如下图
可以看到这里有对象实例,但是因为刚好24字节是8的倍数,所以没有对齐。