new object()在64位hotspot jvm(默认开启指针压缩)下占16字节:对象头12字节(mark word 8字节 + 压缩klass pointer 4字节),实例数据0字节,再经8字节对齐填充4字节。

Object 类在底层没有成员变量,但它的实例在内存中绝不是“空”的——它依然有固定结构的对象头和对齐填充,这是 JVM 运行时语义的基础设施要求。
对象头是强制存在的,不因字段为空而省略
每个 Java 对象(包括 new Object())都必须携带对象头,包含两部分:
- Mark Word:8 字节(64 位 JVM),存储哈希码、GC 年龄、锁状态等动态元数据;
- Klass Pointer:默认开启指针压缩(-XX:+UseCompressedClassPointers)时占 4 字节,指向该对象所属类的元数据(即 Class 对象在元空间中的地址);未开启则为 8 字节。
所以,在典型 64 位 HotSpot JVM(开启压缩)下,Object 的对象头共占 12 字节(8 + 4)。
对齐填充让对象大小必须是 8 的倍数
JVM 要求对象起始地址按 8 字节对齐(objectAddress % 8 == 0),且整个对象占用字节数也必须是 8 的整数倍。12 字节不满足该条件,因此自动补 4 字节 padding,最终大小为 16 字节。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
这就是为什么 ClassLayout.parseInstance(new Object()).toPrintable() 输出中会明确显示:
0 8 mark word ...
8 4 Klass Pointer ...
12 4 (alignment/padding gap) ...
实例数据区确实为空,但布局位置仍被保留
Object 类没有声明任何非静态字段,因此实例数据区长度为 0。但它在内存布局中仍占据一个逻辑位置——位于对象头之后、对齐填充之前。这个区域只是“空着”,不存任何值,也不影响偏移计算。
后续子类继承 Object 后,其字段就紧接在此区域开始排布(父类字段优先),例如 class A { int x; } 的实例,字段 x 就从偏移 12(头尾)处开始存放(再考虑对齐后实际可能从 16 开始)。
方法与静态内容完全不参与实例内存布局
Object 定义的 hashCode()、toString() 等方法,连同所有 static 成员,都存在于元空间(Metaspace)中,属于类级别共享资源,不会为每个 new Object() 分配副本。堆中只存对象头 + 实例数据(此处为空)+ 填充 —— 没有方法体,也没有静态变量拷贝。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










