java中object类实例的对象头固定占12字节(mark word 8字节 + klass pointer 4字节),含运行时数据与类型引用,不依赖字段定义;数组对象额外增加4字节length字段;对象整体需8字节对齐,故new object()实际占用16字节。

Java 中 Object 类实例的对象头信息,是每个 Java 对象在堆中必然存在的元数据区域,它不依赖字段定义,而是由 JVM 自动分配。哪怕是一个空的 new Object(),对象头也完整存在。
对象头由两部分固定组成
在 HotSpot JVM(64 位、默认开启指针压缩)中,Object 的对象头共占 12 字节:
-
Mark Word(8 字节):存储运行时数据,包括哈希码(首次调用
hashCode()前为 0)、GC 分代年龄、锁状态标志(如无锁、偏向锁、轻量级锁)、偏向线程 ID 和时间戳等。这部分结构可复用,内容随对象状态动态变化。 -
Klass Pointer(4 字节):指向方法区(JDK 8+ 是元空间)中该对象所属类的元数据(
java.lang.Class实例)。指针压缩启用时,64 位地址被编码为 32 位偏移量,故仅占 4 字节;若关闭压缩(-XX:-UseCompressedOops),则为 8 字节。
数组对象额外多 4 字节长度字段
普通 Object 实例不含数组长度字段;但若实际是数组(如 new int[0]),对象头末尾会追加一个 4 字节的 length 字段,用于记录元素个数。这是唯一使对象头扩容的场景。
对齐填充让总大小变成 8 字节倍数
对象头本身 12 字节,但 JVM 要求对象起始地址必须是 8 字节对齐。因此,new Object() 在堆中实际占用 16 字节——对象头 12 字节 + 4 字节对齐填充。这个填充不是对象头的一部分,而是独立的占位区域,不携带语义信息。
对象头不包含实例字段或静态变量
注意:对象头只存运行时标识与类型引用,Object 类本身没有实例字段(getClass()、hashCode() 等均为方法),所以其实例数据区为 0 字节。类变量(static 成员)也不属于对象头,它们归属方法区/元空间,与单个对象无关。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











