对象头解析指南:如何理解MarkWord在HotSpot虚拟机中布局

轻明小哥_3350

轻明小哥_3350

2026-03-30

1038人浏览

原创

markword 是 hotspot 对象头中复用存储锁状态、哈希码、gc年龄等元信息的动态字段,其64位布局随对象状态(无锁/偏向/轻量级/重量级/ gc标记)变化而动态解释。

对象头解析指南:如何理解markword在hotspot虚拟机中布局

MarkWord 是 HotSpot 虚拟机中对象头(Object Header)的核心组成部分,它不存储用户数据,却承载着对象的运行时元信息——锁状态、哈希码、GC 分代年龄、偏向线程 ID 等。理解它的内存布局,是深入 JVM 锁优化、垃圾回收和对象生命周期管理的关键一步。

MarkWord 的作用与设计动机

HotSpot 为节省内存并支持多种运行时语义,在对象头中用一个固定大小的字段(通常是 64 位或 32 位,取决于是否开启指针压缩)复用多个含义。这个字段就是 MarkWord。它不是“一值一意”,而是根据对象当前状态动态解释其二进制位。

例如:对象刚创建时,MarkWord 可能保存 identity hash code;被加轻量级锁后,它变成指向栈中锁记录的指针;进入偏向模式后,又存偏向线程 ID 和 epoch;被 GC 标记时,还可能被复用为 forwarding pointer 或 GC 相关标记位。

64 位虚拟机下的典型 MarkWord 布局(开启指针压缩)

在主流服务端环境(64 位 JVM + UseCompressedOops),对象头结构如下(以普通对象、未锁、未偏向为例):

  • 前 25 位:identity_hashcode(未计算时为 0,首次调用 System.identityHashCode() 后写入)
  • 接下来 1 位:age(GC 年龄,最大 15,实际只用低 4 位)
  • 接下来 2 位:biased_lock(偏向锁标志,01 表示启用偏向,00 表示未启用)
  • 接下来 1 位:lock(锁状态标志,01=轻量级锁,10=重量级锁,11=GC 标记,00=无锁/偏向中)
  • 剩余 36 位:根据 lock 和 biased_lock 组合决定含义——可能是偏向线程 ID、栈中锁记录地址、monitor 地址,或为空闲位

注意:具体位宽分配依赖 JVM 版本(如 JDK 8u 与 JDK 17 差异细微)、是否开启 UseBiasedLocking、是否使用 ZGC/Shenandoah 等。可通过 -XX:+PrintJNISupportedTypes 或分析 OpenJDK 源码中的 markOop.hpp 获取确切定义。

如何验证和观察 MarkWord 内容

直接读取对象头需绕过 Java 安全限制,常用方式有:

  • 使用 Unsafe.objectFieldOffset 配合 Unsafe.getLong(需反射获取 Unsafe 实例)读取对象内存起始偏移处的 8 字节
  • 借助 JOL(Java Object Layout) 工具:new ClassLayout.parseInstance(obj).toPrintable() 可输出含 MarkWord 十六进制值及语义解析的完整布局
  • 开启 JVM 参数 -XX:+PrintGCDetails -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly(需 hsdis),结合调试器观察锁膨胀过程中的 MarkWord 变化

例如:执行 synchronized 块前后用 JOL 打印同一对象,可清晰看到 lock 位从 00 → 01 → 10 的跃迁,以及对应字段内容的切换。

常见误区与注意事项

MarkWord 不是“静态结构”,它的解读高度依赖上下文:

  • 调用 System.identityHashCode() 不一定立即写入 MarkWord —— 若对象已加锁,hashcode 会暂存于 monitor 中,解锁后才回填(或丢弃)
  • 偏向锁撤销时,MarkWord 不是简单“清零”,而是先升级为轻量级锁,再根据竞争情况决定是否膨胀;该过程涉及 CAS 修改和多线程协作
  • GC 过程中(尤其 CMS、ZGC 的并发标记阶段),MarkWord 可能被临时覆盖为 mark bit 或 forwarding address,此时常规解读会失效
  • 数组对象的 MarkWord 布局与普通对象一致,但对象头后紧跟的是数组长度(4 字节),而非类指针(Klass Pointer)

不复杂但容易忽略:MarkWord 的每一次位变化,背后都是 JVM 运行时对性能与语义的精细权衡。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10597

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7722

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6732

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1144

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

948

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1396

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2789

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20091

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1235

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习