1. HotSpot 对象内存布局概述
在Java开发中,理解JVM如何管理对象内存是性能调优的基础。虽然JVM规范只定义了对象的行为语义(如字段访问、锁机制等),但具体实现则由各JVM厂商自行决定。HotSpot作为最主流的JVM实现,采用了一种高效且经过精心优化的对象内存布局方案。
与普遍认知不同,HotSpot的对象布局并非JVM规范强制要求。其他JVM实现如OpenJ9、Azul Zing等可能采用完全不同的内存结构。这种实现差异正是Java"一次编写,到处运行"理念的体现——只要外部行为符合规范,内部实现可以自由创新。
HotSpot的对象内存采用三段式结构:
- 对象头(Header):存储元数据信息
- 实例数据(Instance Data):存储对象字段
- 对齐填充(Padding):保证内存对齐
这种设计在空间效率、访问速度和GC友好性之间取得了良好平衡。接下来我们将深入解析每个部分的实现细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 对象头(Header)详解
2.1 对象头的基本组成
对象头是HotSpot对象内存中最关键的部分,它包含了JVM运行所需的核心元数据。对象头采用定长设计,这是为了保证字段偏移量的稳定性——如果对象头长度可变,JIT编译生成的代码就无法使用固定偏移量访问字段,会严重影响性能。
对象头由以下部分组成:
- Mark Word:存储对象运行时数据(8字节)
- Klass Pointer:指向类元数据(4或8字节)
- 数组长度(仅数组对象):4字节
这里有个有趣的命名细节:HotSpot源码中使用"Klass"而非"Class",是因为C++中class是保留关键字。这种命名约定贯穿整个HotSpot代码库,如InstanceKlass、ArrayKlass等。
2.2 Mark Word的结构与演变
Mark Word是对象头中最复杂的部分,它本质上是一个联合体(union),根据最后2-3位的锁标记位,整个字的含义完全不同。这种设计极大节省了内存空间,但也带来了复杂的互斥关系。
以64位JVM为例,Mark Word在不同锁状态下的布局:
无锁状态(01)
code复制| unused:25 | identity_hashcode:31 | unused:1 | age:4 | bi
