每天一点小知识——Java中Object在内存中的布局

220 阅读1分钟
如何查看对象的内存布局
jol打印出来的信息详情

下面两行代码,打印一个Object在内存中的信息

Object obj = new Object();
System.out.println(ClassLayout.parseInstance(obj).toPrintable());

输出如下图: object_01.png

可以分为3个部分

  • 对象头
    1. Mark Word:第一个红框,存储对象的HashCode、GC 分代年龄(4字节,二进制最大值1111,十进制就是15)、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳
    2. 类型指针(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());

输出如下图

object_02.png

可以看到这里有对象实例,但是因为刚好24字节是8的倍数,所以没有对齐。