jol是openjdk提供的轻量级工具,用于精确分析java对象内存布局与占用大小,支持查看对象头、字段对齐、填充字节等细节;需引入0.17版jol-core依赖,通过classlayout查类结构、graphlayout查实例及引用关系,区分shallow size与retained size,结果依赖jvm实际运行参数(如compressedoops)。

JOL(Java Object Layout)是OpenJDK提供的一个轻量级工具,专门用于分析Java对象在JVM堆内存中的内存布局和实际占用大小。它能精确展示对象头、字段对齐、填充字节等细节,比单纯用ObjectSizeCalculator或估算更可靠。
引入JOL依赖
使用Maven,在pom.xml中添加:
<dependency><groupid>org.openjdk.jol</groupid><artifactid>jol-core</artifactid><version>0.17</version></dependency>
注意:确保JVM运行在64位模式(默认),且未开启压缩指针(CompressedOops)时结果更直观;如开启(默认开启),JOL会自动适配并标注。
查看对象浅层大小(Shallow Size)
浅层大小指对象自身占用的内存,不含引用指向的其他对象。常用方法:
-
GraphLayout.parseInstance(obj).totalSize():返回对象及其所有字段直接占用的总字节数(含对齐填充) -
ClassLayout.parseClass(YourClass.class).toPrintable():打印类的内存布局结构(字段偏移、类型、大小) -
VM.current().details():输出当前JVM的内存参数(如是否启用CompressedOops、对象头大小等)
示例:
public class Person {
private int id;
private String name;
}
// 调用
long size = GraphLayout.parseInstance(new Person()).totalSize();
System.out.println(size); // 输出类似 24 或 32 字节(取决于JVM配置)
区分Shallow Size与Retained Size
JOL默认计算的是Shallow Size。若需估算“该对象被回收后能释放多少内存”(即保留集大小),需配合MemoryLayout或手动分析引用链——但JOL本身不直接提供Retained Size。常见误区:
- String对象的
value字段(char[])不计入其Shallow Size,只算引用本身(4或8字节) - 数组对象的Shallow Size包含数组头+元素数据,例如
new int[10]在64位JVM下通常占 24 + 4×10 = 64 字节(头24字节+40字节数据+可能的填充) - 空对象
new Object()在开启CompressedOops的64位JVM中通常占16字节(Mark Word 8字节 + Class Pointer 4字节 + 4字节对齐填充)
运行时注意事项
JOL结果依赖JVM实际运行参数,必须在目标环境中执行才能反映真实布局:
- 确认JVM为64位,且使用
-XX:+UseCompressedOops(默认开启),否则对象头和引用大小会变化 - 避免在GraalVM Native Image等非标准HotSpot环境中使用,JOL仅支持HotSpot JVM
- 字段顺序影响填充:JVM按字段宽度从大到小重排(long/double → int → short/char → byte/boolean),合理排序可减少填充字节
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











