能说一下对象的内存布局吗?
在 HotSpot 虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
对象头主要由两部分组成:
- 第一部分存储对象自身的运行时数据:锁状态标志、哈希码、GC 分代年龄、线程持有的锁、偏向线程 ID、偏向时间戳等,官方称它为 Mark Word,它是个动态的结构,随着对象状态变化。
- 第二部分是类型指针,指向对象的类元数据类型(即对象代表哪个类)。
- 此外,如果对象是一个 Java 数组,那还应该有一块用于记录数组长度的数据。
实例数据用来存储对象真正的有效信息,也就是我们在程序代码里所定义的各种类型的字段内容,无论是从父类继承的,还是自己定义的。
对齐填充不是必须的,没有特别含义,仅仅起着占位符的作用。