象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
- 对象头
- 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。为“MarkWord”。
- 另外一部分是类型指针,即对象指向它的类型元数据的指针,通过这个指针来确定该对象是哪个类的实例。如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据
- 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。为“MarkWord”。
- 实例数据
- 定义的各种类型的字段内容
- 对齐填充
- 这并不是必然存在的。任何对象的大小都必须是8字节的整数倍,不够就填充。