对象在堆内存中的存储布局可以分为对象头、实例数据和对齐填充。
-
对象头(Object Header): 包含两部分主要数据。
- Mark Word(标记字段): 存储对象的标记信息,包括哈希码、GC分代年龄、锁状态标志位、线程持有的锁、偏向线程ID等。
- 类型指针(Class Metadata Address): 指向对象的类元数据的指针,用于确定对象的类型。
如果对象是一个数组,还包含用于记录数组长度的数据。
-
实例数据(Instance Data): 存储代码中所定义的各种类型的字段信息。这部分的大小取决于对象的字段及其数据类型。
-
对齐填充(Padding): 起到占位作用,确保对象的起始地址是8的整数倍。这是由于 HotSpot 虚拟机的要求,对象的起始地址必须对齐,以提高访问效率。
总体来说,对象的内存布局是一种经过优化的存储结构,对象头包含了关于对象的重要信息,实例数据存储了对象的字段信息,而对齐填充则是为了满足虚拟机的要求而添加的。