对象的内存布局
对象在内存中的布局分为3块区域:对象头、实例数据、对齐填充。
1.对象头
包括标志字段(Mark Word)和类型指针(Klass Pointer)两部分信息。
- Mark Word存储对象的哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,是非固定的数据结构以便在极小的空间存储尽量多的信息。
状态 | 标志位 | 存储内容 |
---|---|---|
未锁定 | 01 | 对象哈希码、分代年龄 |
轻量级锁定 | 00 | 指向锁记录的指针 |
重量级锁定 | 10 | 指向重量级锁的指针 |
GC标记 | 11 | 空 |
可偏向 | 01 | 偏向线程ID、偏向时间戳、分代年龄 |
- Klass Pointer存储指向类元数据的指针,虚拟机通过指针来确定对象是那个类的实例。
2.实例数据
存储在对象中定义的各种类型的字段内容。存储顺序受到Java虚拟机分配策略和字段在类中定义顺序的影响。
3.对齐补充
不是必然存在的,仅仅起着占位符的作用。如果实例数据不是8字节的整数倍,需要通过对其填充来补全(对象头部分一定是8字节的整数倍)。