Klass Word不标记锁类型,它仅是指向类元数据的静态指针;锁状态完全由Mark Word动态承载,包括无锁(01)、偏向锁(01+biased_lock=1)、轻量级锁(00)和重量级锁(10)。

Klass Word 不标记锁类型。
这是个常见误解。Klass Word 是对象头中独立于锁机制的元数据指针,它的唯一作用是指向该对象所属类的 InstanceKlass 元数据(存于元空间),用于支撑 getClass()、类型检查、虚方法分派等运行时操作。它不参与锁状态管理,也不存储任何与偏向锁、轻量级锁或重量级锁相关的信息。
真正记录锁状态的是 Mark Word
锁类型完全由 Mark Word 动态承载,其 64 位(64 位 JVM,默认开启压缩指针)内容随对象状态实时切换:
- 无锁状态:后 2 位为
01,高位可能存 hashCode 或 GC 年龄 - 偏向锁:后 2 位仍为
01,但第 3 位biased_lock = 1,后续字段存线程 ID 和 epoch - 轻量级锁:后 2 位变为
00,高位存指向当前线程栈中 Lock Record 的指针 - 重量级锁:后 2 位变为
10,高位存堆中 ObjectMonitor 对象的地址
为什么容易混淆 Klass Word 和锁?
因为两者都在对象头里,且位置相邻:
构建并排查Microsoft Word邮件合并及DOCX模板工作流,使用合并域、内容控件、文档属性、重复区块、数据等
立即学习“Java免费学习笔记(深入)”;
- 对象头 = Mark Word(8 字节) + Klass Word(4 或 8 字节) +(可选)数组长度(8 字节)
- Mark Word 在前,负责锁、hash、GC 年龄等动态信息
- Klass Word 在后,只负责静态类型定位,内容固定不变(除非发生类卸载)
验证方式很直接
用 JOL(Java Object Layout)工具打印对象内存布局,能清晰看到:
- Mark Word 值随
synchronized执行而变化(如从0x0000000000000001变为0x00007f8b4c00a800) - Klass Word 值在整个生命周期内基本恒定(如始终指向
0x00007f8b4c00a800类元数据地址)
所以,查锁状态——盯 Mark Word;找类信息——看 Klass Word。二者职责分明,互不越界。

















