Java对象内存由对象头、实例数据和对齐填充三部分组成;对象头含Mark Word(存哈希码、锁状态等)和类型指针(指向Klass结构),数组对象额外含4字节长度字段;64位JVM默认压缩指针使类型指针占4字节,对象需8字节对齐,不足则填充。

Java对象在内存中主要由三部分组成:对象头(Object Header)、实例数据(Instance Data)和对齐填充(Padding)。其中,对象头是JVM管理对象的核心元数据区域,直接影响锁机制、GC标记、哈希码生成等关键行为。
对象头包含哪些字段
对象头通常分为两部分:Mark Word 和 Class Metadata Address(类型指针)。
- Mark Word:大小为一个机器字长(32位JVM为4字节,64位默认为8字节),存储内容动态变化,包括:对象哈希码(未锁定时)、GC分代年龄、锁状态标志(无锁/偏向锁/轻量级锁/重量级锁)、线程ID(偏向锁模式下)、指向Monitor的指针(重量级锁)等;
- Class Metadata Address:即类型指针,指向该对象所属类的Klass结构在方法区(元空间)中的地址,用于确定对象类型、支持多态和反射;
- 在数组对象中,对象头还会额外包含一个4字节的数组长度字段,紧随类型指针之后。
64位JVM下的对象头布局(默认开启指针压缩)
HotSpot JVM在64位平台默认启用CompressedOops(压缩指针),使对象引用占4字节而非8字节。此时对象头典型布局如下:
- Mark Word:8字节(64位);
- Class Pointer:4字节(压缩后);
- 数组长度(仅数组对象):4字节;
- 后续紧跟实例字段(按宽度从大到小排列,并考虑CPU缓存行对齐)。
注意:关闭指针压缩(-XX:-UseCompressedOops)后,Class Pointer变为8字节,对象头整体变大,可能影响内存占用与缓存局部性。
立即学习“Java免费学习笔记(深入)”;
对象内存对齐与填充的作用
JVM要求对象起始地址必须是8字节的整数倍(即按8字节对齐),这是由硬件内存访问特性决定的。若对象头加实例数据总大小不是8的倍数,JVM会在末尾自动添加填充字节(Padding)。
- 例如:一个只有1个boolean字段的对象,在64位+压缩指针环境下,对象头共12字节(8+4),实例数据1字节,合计13字节 → 补5字节填充至16字节对齐;
- 填充不存储有效数据,但能提升CPU读取效率,避免跨缓存行访问带来的性能损耗。
如何查看实际对象内存布局
可通过JOL(Java Object Layout)工具验证。例如:
mvn org.openjdk.jol:jol-cli:0.16:run -Dexec.args="java.lang.String"
输出会显示对象头各字段偏移、大小、实例字段布局及总占用内存。调试时建议配合-XX:+UseSerialGC(避免G1等复杂GC干扰布局)和-XX:-UseCompressedOops(便于观察原始结构)对比分析。

















