对象的内存布局
在Java虚拟机(HotSpot)中,对象在 Java 内存中的 存储布局 可分为三块:
- 对象头 存储区域
- 实例数据 存储区域
- 对齐填充 存储区域
对象头区域:
存储对象自身的运行时数据,如:哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳。
存储对象类型指针,即对象指向类元数据的指针,JVM可以确定这个对象属于哪个类的实例。
如果是数组,对象头中还有一块记录数组长度的数据。
实例数据区域:
- 代码中定义的字段内容。
对齐填充区域:
- 占位符。
- 非必须。
说明:占位符起占位作用,因为对象的大小必须是8字节的整数倍,而因HotSpot VM的要求对象起始地址必须是8字节的整数倍,且对象头部分正好是8字节的倍数。因此,当对象实例数据部分没有对齐时(即对象的大小不是8字节的整数倍),就需要通过对齐填充来补全。