Java对象内存布局由对象头、实例数据和对齐填充三部分组成,JOL工具可精确显示各字段偏移量、大小及整体字节数:对象头含Mark Word(OFFSET 0,8字节)和Klass Pointer(OFFSET 8,4或8字节),数组含length字段(OFFSET 12,4字节);实例数据按优化后顺序排列;对齐填充以Alignment gap形式体现,确保总大小为8字节整数倍。

Java对象内存布局由对象头、实例数据和对齐填充三部分组成,要真实看到这三块在内存中的分布和字节数,最直接可靠的方式是使用 JOL(Java Object Layout) 工具——它能精确打印出每个字段的偏移量、大小及整体占用字节。
用 JOL 查看对象头结构
对象头包含 Mark Word 和 Klass Pointer(数组对象还有 Length 字段)。JOL 输出中会明确标出:
- OFFSET 为 0 的位置通常是 Mark Word(默认 8 字节,64 位 JVM 开启指针压缩时)
- 紧接着 OFFSET 为 8 的位置是 Klass Pointer(通常 4 字节,关闭压缩后为 8 字节)
- 数组对象会在 OFFSET 12 处显示 4 字节的 length 字段
- 通过
ClassLayout.parseInstance(obj).toPrintable()可输出带注释的完整布局
从 JOL 输出识别实例数据排布
实例数据区域紧接对象头之后,按字段声明顺序(含父类字段)排列,但受 JVM 字段重排序优化影响,实际顺序可能调整为:long/double → int → short/char → byte/boolean → reference。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 每个字段显示其 OFFSET(距对象起始地址的字节偏移)、TYPE 和 SIZE
- 例如
int value可能出现在 OFFSET 12,占 4 字节;Object ref在 OFFSET 16,占 4 字节(压缩指针) - 引用类型字段本身不存对象内容,只存地址,其大小取决于是否启用 Compressed Oops
对齐填充在 JOL 中如何体现
对齐填充不是独立字段,而是布局末尾自动补足的空白字节,确保总大小是 8 字节整数倍。
立即学习“Java免费学习笔记(深入)”;
- JOL 输出最后一行会显示 "Instance size"(如 32 bytes),以及 "Alignment gap"(如 3 bytes)
- 若对象头(12B)+ 实例数据(17B)= 29B,则自动补 3 字节 padding,凑成 32B
- 该区域无字段名、无 OFFSET,仅表现为“空隙”,但计入对象总内存占用
快速验证步骤
只需三步即可实测:
- 在 Maven 项目中添加依赖:
<groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.17</version> - 写一个测试类(含不同字段组合),new 出实例
- 调用
ClassLayout.parseInstance(new YourClass()).toPrintable()打印结果

















