对象在内存中的存储布局
在HotSpot虚拟机中Java对象在内存中的存储布局主要分为三个部分对象头Header、实例数据Instance Data和对齐填充Padding。这一结构是理解JVM内存管理、锁机制与性能优化的基础。一、对象头Header对象头存储对象的元信息主要包括两部分1. Mark Word用于存储对象的运行时数据如哈希码identity hash codeGC分代年龄锁状态标志无锁、偏向锁、轻量级锁、重量级锁线程持有的锁偏向线程ID与偏向时间戳Mark Word 的结构是动态的会根据对象的状态复用空间以节省内存 。2. Class Pointer类型指针指向该对象所属类的元数据即方法区中的类信息JVM通过它确定对象类型 。默认开启指针压缩-XX:UseCompressedClassPointers时为4字节64位系统关闭后为8字节⚠️ 若对象为数组对象头还额外包含 数组长度 字段因为从元数据无法推断数组大小 。二、实例数据Instance Data这是对象真正存储的有效信息即程序中定义的成员变量内容包括本类中定义的字段从父类继承的字段字段的排列顺序受虚拟机参数 -XX:FieldsAllocationStyle 影响默认顺序为long/double → int → short/char → byte/boolean → oops引用类型默认开启引用类型压缩-XX:UseCompressedOops时为4字节相同宽度的字段会被分组存放以提高内存访问效率 。例如一个包含 int a; long b; Object ref; 的对象其字段按 b8字节→ a4字节→ ref4字节 排列64位指针压缩。三、对齐填充Padding并非必然存在仅起占位作用。HotSpot VM要求对象总大小必须是 8字节的整数倍。当前两部分总大小不满足对齐要求时通过填充字节补全 。✅ 示例若对象头12字节 实例数据16字节 28字节则需填充4字节使总大小为32字节。