Java对象在JVM堆中采用三段式布局:对象头(含Mark Word、类指针、数组长度)、实例数据(按字段宽度降序重排)和对齐填充(末尾补至8字节整数倍),直接影响对象大小、内存效率与GC行为。

对象头(Header):运行时元信息容器
对象头是每个Java对象必有的头部区域,包含两类关键信息:
- Mark Word:32位JVM占4字节,64位默认占8字节;存储hashCode、锁状态(无锁/偏向/轻量级/重量级)、GC分代年龄、偏向线程ID与时间戳等动态信息。
-
Class Pointer(类型指针):指向方法区中该对象所属类的元数据;开启指针压缩(
-XX:+UseCompressedClassPointers,默认开启)时为4字节,否则为8字节。 - Array Length(仅数组对象):额外4字节,存数组长度,使数组对象头比普通对象多一个字段。
例如:在64位JVM且开启压缩指针时,普通对象头 = Mark Word(8字节) + Class Pointer(4字节) = 12字节;数组对象头再加4字节长度字段,共16字节。
实例数据(Instance Data):字段值的实际存放区
这部分存放对象真正持有的字段值(包括父类继承的字段),但不按Java源码声明顺序排列,而是按JVM字段排序策略重排:
- 先按字段宽度从大到小排序:long/double → int/float → char/short → byte/boolean。
- 相同宽度字段归为一组,组内顺序按源码声明顺序保持。
- 这样能减少内存空洞,提升空间利用率和CPU缓存命中率。
比如一个类含 byte a、long b、int c、boolean d,实际内存中会排成:long b(8字节)→ int c(4字节)→ byte a + boolean d(共2字节,可能紧邻)→ 剩余空间再考虑对齐。
立即学习“Java免费学习笔记(深入)”;
对齐填充(Padding):强制8字节对齐的“补位区”
JVM要求每个对象占用的总内存必须是8字节的整数倍,这是为了适配CPU缓存行(通常64位系统以8字节为基本寻址单位),避免跨缓存行读写带来的性能损耗。
- 对齐填充没有语义,不存任何数据,只是用0字节“垫满”到下一个8字节边界。
- 是否需要填充、填多少,取决于对象头+实例数据的总字节数模8的余数。余数为0则无需填充;余数为r,则补
8−r字节。 - 例如:对象头12字节 + 实例数据17字节 = 29字节 → 需填充3字节 → 总大小为32字节。
注意:对齐填充只发生在对象末尾,不插入字段之间;它不是Java语言特性,而是HotSpot堆内存管理的硬性约束。
不复杂但容易忽略


















