java对象在hotspot jvm堆中严格按对象头→实例数据→对齐填充三部分顺序布局:对象头含mark word、类指针(压缩时4字节)及可选数组长度;实例数据按字段宽度降序排列以优化空间;末尾对齐填充确保总大小为8字节倍数。

Java对象在HotSpot JVM堆内存中的布局是严格分段、按规则对齐的,不是随意堆放的。它由三部分顺序组成:对象头 → 实例数据 → 对齐填充,从低地址向高地址依次排布。
对象头:元信息与类型指针的紧凑组合
对象头紧贴对象起始地址,包含运行时关键元数据: - Mark Word(8字节):存储哈希码、GC年龄、锁状态(无锁/偏向/轻量级/重量级)、偏向线程ID和时间戳等;内容动态变化,比如加锁后可能存Monitor指针。 - Class Pointer(4字节或8字节):指向方法区中该类的Klass结构体地址;默认开启指针压缩(-XX:+UseCompressedOops)时为4字节,否则为8字节。 - 数组长度(仅数组对象,4字节):紧跟Class Pointer之后,用于支持length字段快速访问。普通对象对象头大小为12字节(压缩指针)或16字节(未压缩);数组对象则再加4字节,共16或20字节。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
实例数据:字段按宽度降序排列,自动紧凑布局
紧随对象头之后,存放所有成员变量的实际值(包括父类继承的字段): - JVM会将字段按**宽度从大到小重排**(long/double → int/float → short/char → byte/boolean),以减少内存空洞; - 相同宽度字段会连续存放,提升缓存局部性; - 引用类型字段在压缩指针下占4字节,未压缩下占8字节; - 不同字段间可能存在自然对齐间隙(如int前插1字节padding使地址对齐),但JVM会尽量优化。例如:long a; int b; byte c; 实际布局可能是 a(8) + b(4) + c(1) + padding(3),而非声明顺序。
对齐填充:补足至8字节整数倍的“隐形占位符”
位于实例数据末尾,仅当对象总大小不是8字节倍数时才存在: - HotSpot要求每个对象占用内存必须是8字节的整数倍(便于内存管理与CPU缓存对齐); - 对齐填充没有语义,不存任何数据,也不参与GC; - 它不是固定字段,而是根据对象头+实例数据总长度动态计算得出; - 比如对象头12字节 + 实例数据13字节 = 25字节 → 向上对齐到32字节 → 填充7字节。不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










