Java Object Layout查看对象布局工具

Java Object Layout查看对象布局工具

引入的maven配置文件如下

<!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.10</version>
</dependency>

查看对象的代码

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

运行后,展示结果如下

java.lang.Object 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)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

对象头的第一部分markword 用来保存锁信息。

在这里插入图片描述
上方图片对应的是对象头中的markword,占8个字节。以下是指针类型,也是对象头的一部分,占4个字节。

在这里插入图片描述

对象在内存中的存储结构

在这里插入图片描述

最上方新建对象代码因为没有对象实际数据,因此只有对象头12个字节。又因为无论是32位还是64位的HotSpot,使用的都是8字节对齐。也就是说每个java对象,占用的字节数都是8的整数倍。因此补齐4个字节,总计16个字节。

以上结构是普通对象,数组对象会多4个字节(数组长度)。
HotSpot虚拟机的对象头包括两部分信息,第一部分是**“Mark Word”**,用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等

在这里插入图片描述

对象头的另外一部分是类型指针,即是对象指向它的类的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说查找对象的元数据信息并不一定要经过对象本身。另外,如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中无法确定数组的大小。

注意:如果是不用 -XX:-UseCompressedOops这个参数,则类型指针占用8个字节,对象头占用12个字节。user对象int及string 分别占用4个字节。因此共计24个字节

猜你喜欢

转载自blog.csdn.net/weixin_43221207/article/details/106680873