Java对象头大小取决于JVM位数、指针压缩开关及是否为数组:64位+压缩时通常12字节(Mark Word 8字节 + Klass Pointer 4字节),但因8字节对齐常填充至16字节;关闭压缩则为16字节;数组额外增加4字节长度字段,压缩下为16字节(12+4)、非压缩下为20字节,再按8字节对齐。

Java对象头(Header)在内存中的字节占用,取决于JVM位数、是否启用指针压缩(CompressedOops),以及对象是否为数组。核心规律是:它由Mark Word和Klass Pointer两部分构成,实际大小受对齐规则影响。
64位JVM + 默认开启指针压缩(最常见场景)
这是现代生产环境的主流配置(如JDK8u+、JDK11+默认启用)。此时对象头共占12字节:
- Mark Word:8字节(64bit),存储哈希码、分代年龄、锁状态标志等,内容随锁状态动态复用
- Klass Pointer:4字节(32bit),指向方法区中的类元数据;压缩原理是利用对象8字节对齐特性,用4字节偏移量表示最大约32GB堆空间
注意:虽然理论总和是12字节,但JVM要求对象起始地址必须是8字节对齐,因此某些JVM实现会将对象头填充至16字节(加4字节Padding),以保证后续字段对齐。实际占用需结合具体JVM版本和jol工具验证。
64位JVM + 关闭指针压缩
通过启动参数 -XX:-UseCompressedOops 关闭压缩后,Klass Pointer恢复为8字节:
立即学习“Java免费学习笔记(深入)”;
- Mark Word:8字节
- Klass Pointer:8字节
- 合计:16字节,天然满足8字节对齐,通常无需额外填充
数组对象额外占用4字节
所有数组对象(如new int[0]、new Object[5])的对象头比普通对象多一个字段:
- 在上述12字节(压缩)或16字节(非压缩)基础上,再加4字节数组长度
- 即:压缩下为16字节(12+4),非压缩下为20字节(16+4),之后再按8字节向上对齐
验证方式:用jol工具看真实布局
光靠理论易出偏差,推荐用OpenJDK官方工具JOL(Java Object Layout)实测:
- Maven依赖:
org.openjdk.jol:jol-core - 代码示例:
ClassLayout.parseInstance(new Object()).toPrintable() - 输出会明确显示“Header: X bytes”,包含对象头、实例数据、Padding的逐项字节数


















