在 Java 虚拟机(JVM)中,每个对象的对象头包含了重要的元数据,这些信息用于管理对象的生命周期、同步、垃圾回收等。对象头分为两部分:Mark Word 和 Class Pointer。具体来说,对象头里包含以下信息:
1. Mark Word
Mark Word 是对象头的主要部分,用于存储对象的状态信息。它的内容会根据对象的状态和 JVM 的不同版本有所变化。Mark Word 包括以下信息:
-
对象哈希码:
- 对象的哈希码用于对象的哈希计算。哈希码可能在对象的生命周期内发生变化,尤其是在对象的锁状态被改变时。
-
锁信息:
- 无锁状态: 对象头的 Mark Word 中没有锁信息。
- 偏向锁: 偏向锁状态下,Mark Word 中包含偏向线程的 ID,表示该线程拥有锁。
- 轻量级锁: 轻量级锁状态下,Mark Word 中存储了锁的指针(如自旋锁的记录)。
- 重量级锁: 重量级锁状态下,Mark Word 包含指向操作系统的线程调度信息(通常是一个指针)。
-
GC 信息:
- Mark Word 可能包含垃圾回收(GC)相关的信息,例如对象的年龄和分代信息。
2. Class Pointer
Class Pointer 是对象头的第二部分,指向对象的类元数据。这部分包含了对象所属类的 Class
对象的引用。Class
对象存储了与类相关的结构信息,如字段、方法、超类等。
对象头的布局(以 HotSpot JVM 为例)
在 HotSpot JVM 中,对象头的布局可能如下:
-
无锁状态:
Mark Word
仅包含对象的哈希码。Class Pointer
指向对象的类元数据。
-
偏向锁状态:
Mark Word
存储了偏向线程的 ID。Class Pointer
仍然指向对象的类元数据。
-
轻量级锁状态:
Mark Word
存储了锁记录指针。Class Pointer
仍然指向对象的类元数据。
-
重量级锁状态:
Mark Word
存储了指向操作系统线程调度信息的指针。Class Pointer
仍然指向对象的类元数据。
对象头的具体内容
- 对象的身份: 包括对象的哈希码和类信息,帮助 JVM 识别和管理对象。
- 同步信息 : 用于实现
synchronized
同步机制,包括锁的状态和信息。 - 垃圾回收信息: 如对象的年龄和代数,用于垃圾回收策略。
示例
假设我们有一个 Java 对象 myObject
,它的对象头可能包含:
-
Mark Word:
- 哈希码
- 锁状态(偏向锁、轻量级锁、重量级锁)
- GC 信息(可能的对象年龄)
-
Class Pointer:
- 指向
myObject
所属的Class
对象
- 指向
总结
Java 对象的对象头包含了用于对象管理和同步的各种信息。它主要包括 Mark Word
和 Class Pointer
。Mark Word
用于存储对象的状态信息,如哈希码、锁信息和 GC 信息,而 Class Pointer
指向对象所属的 Class
对象。这些信息是 JVM 内部实现对象管理、同步和垃圾回收等功能的基础。