1. 为什么需要了解Java对象头?
在Java开发中,我们每天都在创建和使用对象,但很少有人真正关注对象在内存中的存储结构。对象头(Object Header)作为每个Java对象不可或缺的组成部分,直接影响着内存占用、锁机制和垃圾回收等关键性能指标。理解对象头的工作原理,能帮助我们:
- 更准确地评估内存消耗
- 深入理解synchronized锁的底层实现
- 优化对象布局以减少内存占用
- 诊断与内存相关的性能问题
以一个简单的User类为例:
java复制class User {
int id;
String name;
}
当我们创建User对象时,JVM会在堆内存中分配一块连续空间,其中就包含对象头。对象头的大小和内容会根据JVM实现和运行环境而变化,但基本结构是通用的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Java对象头的组成结构
2.1 对象头的标准布局
在HotSpot JVM中,对象头通常包含两部分:
- Mark Word:存储对象自身的运行时数据
- Klass Pointer:指向类元数据的指针
在64位JVM上,对象头通常占用12字节(开启压缩指针)或16字节(未开启压缩指针)。让我们用表格展示Mark Word在不同状态下的内容:
| 锁状态 | 存储内容 | 标志位 |
|---|---|---|
| 无锁 | 对象哈希码、分代年龄等 | 01 |
| 偏向锁 | 持有偏向锁的线程ID、时间戳等 | 01 |
| 轻量级锁 | 指向栈中锁记录的指针 | 00 |
| 重量级锁 | 指向互斥量(monitor)的指针 | 10 |
| GC标记 | 空(不需要记录信息) | 11 |
2.2 指针压缩的影响
现代JVM默认开启指针压缩(-XX:+UseCompressedOops)
