java对象头由mark word(8字节)和klass pointer(4或8字节)构成,前者动态复用存储锁状态与哈希码,后者指向类元数据,共同支撑运行时行为、类型识别及内存布局。

Java对象头由Mark Word和Klass Pointer两部分构成,它们共同支撑对象的运行时行为与类型识别。理解这两者,是分析锁机制、GC行为和内存占用的基础。
Mark Word:动态复用的状态字段
Mark Word是对象头中最具变化性的部分,大小固定为8字节(64位JVM),其内部bit布局随对象状态实时切换:
- 无锁状态:存储identity hashcode(25位)、分代年龄(4位)、偏向锁标识(1位)、锁标志位(2位)等;
- 偏向锁状态:保留线程ID(54位)、epoch(2位)、偏向锁开关等,用于快速重入;
- 轻量级锁状态:存栈中Lock Record地址(指向当前线程栈帧);
- 重量级锁状态:存ObjectMonitor指针,进入系统级阻塞队列。
这种“一域多用”的设计避免了为每种状态单独分配空间,是HotSpot对内存极致压缩的体现。
Klass Pointer:指向类型的桥梁
Klass Pointer是一个指向方法区中类元数据(instanceKlass)的指针,JVM靠它完成类型校验、虚方法解析、反射调用等关键操作。
中文敏感词/违禁词检测与内容合规性检查工具。支持对小红书(Xiaohongshu)、Douyin(抖音)、WeChat(微信)、Weibo(微博)、Bilibili(哔哩哔哩)、Zhihu(知乎)、Taobao(淘宝)、JD.com(京东)等主流平台的禁用词、限用词及高风险词进行文本扫描与合规性分析。
- 默认开启指针压缩(-XX:+UseCompressedOops)时占4字节;
- 关闭压缩后升至8字节,对象头总大小从12B变为16B;
- 该指针不参与对象字段排列,始终紧接Mark Word之后,位置固定。
对象头在内存布局中的实际占比
以64位JVM + 指针压缩为例,一个最简对象(如new Object())结构如下:
- Mark Word:8字节;
- Klass Pointer:4字节;
- 对齐填充:4字节(凑满8字节倍数);
- 合计对象头16字节,占整个对象最小内存单元(16B)的100%。
若对象含字段(如int a; long b;),实例数据部分增长,但对象头仍稳定为12B(未填充)或16B(填充后),其占比随字段增多而下降。
如何验证你的对象头结构
借助JOL(Java Object Layout)工具可直观查看:
- 添加依赖:
org.openjdk.jol:jol-core; - 调用
ClassLayout.parseClass(YourClass.class).toPrintable(); - 观察输出中“HEADER”区域,明确标出mark word与klass pointer偏移及大小。
注意:不同JDK版本、是否启用压缩、是否开启分代年龄等参数,都会影响实际布局,实测优先于理论推测。










