jol工具可直观查看java成员变量在堆内存中的分布,显示字段偏移、对齐填充及对象头大小;需引入0.17版jol-core依赖,通过classlayout或graphlayout输出布局详情,支持类级与实例级分析,并依jvm压缩指针设置影响引用大小及整体对齐。

Java中成员变量在堆内存中的分布,可以用JOL(Java Object Layout)工具直观查看。它能显示对象在内存中的实际布局,包括字段偏移、对齐填充、对象头大小等细节,特别适合分析对象内存占用和字段排列顺序。
添加 JOL 依赖
使用 Maven,在 pom.xml 中加入:
<dependency><groupid>org.openjdk.jol</groupid><artifactid>jol-core</artifactid><version>0.17</version></dependency>
基本用法:查看单个对象内存布局
调用 GraphLayout.parseInstance(obj).toPrintable() 或 ClassLayout.parseClass(YourClass.class).toPrintable() 即可输出详细布局。
- 实例级查看:创建对象后传入,反映运行时实际布局(含对象头、字段、对齐填充)
- 类级查看:不依赖实例,只看类定义的字段排布逻辑,适用于分析字段顺序优化
- JVM 默认开启压缩指针(-XX:+UseCompressedOops),64位系统下引用占4字节;关闭后引用变为8字节,布局会明显变化
观察字段排列与内存对齐
JOL 输出中重点关注三列:OFFSET(偏移)、TYPE(类型)、SIZE(大小)。JVM 按照“8字节对齐”原则填充,字段按以下顺序排列:
- 先排 long/double(8字节)
- 再排 int/float(4字节)
- 然后是 short/char(2字节)、byte/boolean(1字节)
- 最后是 reference(默认4字节,压缩指针开启时)
- 若字段顺序不合理(如把 byte 放在 long 前面),JVM 会在中间插入填充字节,浪费空间
验证字段重排序效果
手动调整成员变量声明顺序,对比 JOL 输出的 OFFSET 和总大小:
- 将大字段(long、double、引用)放在前面,小字段(byte、boolean)集中放后面,可显著减少填充
- 例如:一个含 2 个 long + 4 个 byte 的类,按 long/long/byte/byte/byte/byte 排列,总大小通常为 32 字节;若改为 byte/long/byte/long/byte/byte,则可能膨胀到 40 字节甚至更多
- JOL 不会改变代码行为,但能帮你发现潜在的内存浪费点
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











