Mark Word 是 Java 对象头中动态复用的 64 位核心字段,依对象状态存储哈希码、锁信息(偏向/轻量/重量级)或 GC 标记,通过锁状态位隔离不同用途,支撑 synchronized、hashCode 和垃圾回收协同运行。
Mark Word 是 Java 对象头(Object Header)中最核心的字段之一,它不是固定存储某一种信息,而是根据对象当前状态动态复用同一块内存空间,主要服务于锁机制和垃圾回收两大关键场景。
在 64 位 JVM 中,Mark Word 占 64 位(8 字节),但不会同时存满所有内容。它的布局随对象状态切换,典型用途包括:
hashCode() 后写入;若未调用,则这部分可被后续锁状态复用Mark Word 通过高几位(通常是 2–3 位)定义锁状态标志(lock b
its),例如:
而 GC 使用的标记信息(如分代年龄占 4 位、GC 标志位占 1 位)被安排在其余空闲位上。JVM 严格约定:同一时刻只有一种主导状态生效,GC 运行期间会暂停应用线程(STW)或采用读屏障保障一致性,因此不会出现锁位与 GC 位互相覆盖或误读。
Mark Word 的状态变化直接影响程序行为:
hashCode() 后再加锁,可能触发锁膨胀(因哈希码已占用原偏向/轻量位)-XX:-UseBiasedLocking 后,偏向锁位不再使用,节省了部分判断开销基本上就这些。它不暴露给开发者直接操作,却是 synchronized、hashCode、GC 三者协同运转的隐性枢纽。