对象结构

image.png
Java对象结构 - 图2

对象头

HotSpot虚拟机的对象头包括两部分信息:

  1. markword :第一部分 markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit,官方称它为“MarkWord”。
  2. klass:对象头的另外一部分是 klass 类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
  3. 数组长度只有数组对象有):如果对象是一个数组,那在对象头中还必须有一块数据用于记录数组长度。

    64位 markord 结构(对象标记)


    Java对象结构 - 图3

    实例数据

    实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。
    无论是从父类继承下来的,还是在子类中定义的,都需要记录起来。

    对齐填充

    第三部分对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说,就是对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数,因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

    对象大小计算

    要点

  • 在32位系统下,MarkWord是4字节,存放Class指针的空间大小是4字节,对象头共8字节。
  • 在64位系统下,不开启指针压缩的情况下,MarkWord是8字节,存放Class指针的空间大小是8字节,对象头共16字节;开启指针压缩的情况下,MarkWord是8字节,存放Class指针的空间大小是4字节,对象头共12字节。
  • 数组长度为4字节。
  • 静态属性不算在对象大小内。

    jvm oop-klass对象模型

    参考链接:https://blog.csdn.net/sc9018181134/article/details/80643360