对象头(Object Header)是Java对象中用于存储对象自身运行时数据的内存空间,它包含三个字段:
- Mark Word:存储对象的散列码、GC分代年龄、锁状态标志、线程持有的锁等信息。
- Class Pointer:存储对象指向其Class对象的指针。
- Array Length:对于数组对象来说,存储数组长度信息。
对象头的大小是8个字节(64位机器),Mark Word占4个字节,Class Pointer占4个字节。对于数组对象,Array Length占4个字节,Mark Word和Class Pointer各占2个字节。
对象头存储的数据主要用于:
- GC:通过Mark Word获取对象分代年龄信息,决定进行GC。
- 锁机制:通过Mark Word存储对象锁信息,实现synchronized的锁机制。
- 数组遍历:通过Array Length读取数组长度进行遍历。
- 反射:通过Class Pointer找到对象的类信息。
- HashCode():返回对象的散列码,用于散列表查找。
来看一个简单例子:
public class ObjectHeaderDemo {
public static void main(String[] args) {
// 普通对象
Object obj = new Object();
// 数组对象
int[] arr = new int[10];
}
}
对于obj对象,它的对象头包含Mark Word和Class Pointer。
对于arr数组对象,它的对象头包含Mark Word、Class Pointer和Array Length。
通过对象头存储的信息,虚拟机可以在运行时管理对象,实现GC、锁机制和数组访问等操作。