查看 Java对象布局

文档

官方文档地址

环境

jdk:Hotspot 11.0.5版本

1.添加如下依赖


      org.openjdk.jol
      jol-core
      0.9

示例类

public class A {
    private int i;
    private boolean b;
    private long l;
}

public class T {
    private int i;
    private A a;
}

2. 使用如下代码打印对象的布局

        T t = new T();
        System.out.println(Integer.toHexString(t.hashCode()));
        String s = ClassLayout.parseInstance(t).toPrintable();
        System.out.println(s);

结果如下

6b71769e
org.example.T object internals:
 OFFSET  SIZE            TYPE DESCRIPTION                               VALUE
      0     4                 (object header)                           01 9e 76 71 (00000001 10011110 01110110 01110001) (1903599105)
      4     4                 (object header)                           6b 00 00 00 (01101011 00000000 00000000 00000000) (107)
      8     4                 (object header)                           48 72 06 00 (01001000 01110010 00000110 00000000) (422472)
     12     4             int T.i                                       0
     16     4   org.example.A T.a                                       null
     20     4                 (loss due to the next object alignment)
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

解释

注意

由于Intel CPU是小端存储,所以这里的字节需要倒着看。

前面3个4字节的Object header是对象头部分,后面就是Filed部分,最后加上 loss due to the next object alignment(由于下一个对象对齐而造成的损失)对齐填充。

对象头

包含mark word + klass pointer + 数组长度(只有对象是数组时才有);
mark word 在64位虚拟机中占64bit,klass pointer因为默认开启指针压缩,所以是32bit;

你可能感兴趣的:(查看 Java对象布局)