Java对象内存布局由对象头、实例数据、对齐填充三部分组成:对象头含Mark Word和类型指针,存储元信息;实例数据按字段宽度排序存放业务数据;对齐填充确保总大小为8字节倍数。

Java对象在内存中的布局不是字段简单堆叠,而是由三块严格划分的区域组成:对象头、实例数据、对齐填充。理解对象头和实例数据的关键,在于区分“元信息”和“业务数据”——前者服务于JVM运行时机制(如锁、GC、类型识别),后者才是你定义的字段值。
对象头:每个对象的运行时身份证
对象头是固定前置结构,不随字段增减而变化,所有对象都有,且内容动态可变。
- Mark Word(8字节,固定):存储哈希码、GC分代年龄、锁状态标志等。它不是静态存储区,而是复用同一块空间:未加锁时存hashCode;偏向锁时存线程ID和epoch;轻量级锁时存栈中Lock Record地址;重量级锁时存Monitor指针。
-
类型指针(Klass Pointer,4或8字节):指向方法区中该类的Klass元数据。64位JVM默认开启指针压缩(
-XX:+UseCompressedOops),此时为4字节;关闭后升为8字节。 - 数组额外字段(+4字节):仅数组对象有,用于存储length,因此数组对象头共16字节(8+4+4)。
实例数据:字段值的真实落脚点
这部分紧跟对象头之后,存放你声明的所有实例字段(含父类继承字段),但顺序不等于代码声明顺序。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 字段按宽度从大到小排列:long/double(8字节)→ int/float(4字节)→ char/short(2字节)→ byte/boolean(1字节),相同宽度字段会集中存放,目的是减少后续对齐填充。
- 引用类型字段只占4字节(指针压缩下),它本身不包含目标对象内容,所指对象另存于堆中其他位置。
- 父类字段一定排在子类字段之前,这是继承关系决定的硬性规则。
对齐填充:让总大小成为8字节倍数
这不是独立“部分”,而是为了满足CPU访问效率要求的补位操作。HotSpot要求对象总大小必须是8字节整数倍,否则会在末尾自动填充无意义字节。
立即学习“Java免费学习笔记(深入)”;
- 计算公式:
(8 − (对象头 + 实例数据) % 8) % 8 - 例如:
new Object():头12B + 数据0B = 12B → 补4B → 总16B;int id; String name; boolean active;:头12B + (4+4+1)=9B = 21B → 补3B → 总24B。 - 填充本身不存任何数据,纯属空间代价,但能提升缓存行利用率和CAS指令成功率。
不复杂但容易忽略

















