我正在try 使用Java Object Layout(JOL)来测量持有一些Java记录的实例的对象的实例大小.当我使用GraphLayout.parseInstance
时,我得到一个UnsupportedOperationException
,描述为"Can‘t Get field Offset on a Record Class".当使用ClassLayout.parseClass
时,我得到相同的错误.
我最初使用的是Java 20,但已经降级到Java 17.我try 了Jol的最后两个版本(0.17和0.16).我try 了堆栈跟踪中的建议"无法获取字段偏移量,try 使用-Djol.magicFieldOffset=true".看起来记录在HotspotUnsafe.fieldOffset
中不受支持,特别是在不安全中的第647行.
下面是一个传递和抛出异常的类似记录的类的示例.
public class Outer {
public static void main(String[] args) {
// Passes - outputs 72
System.out.println(GraphLayout.parseInstance(new A(1, "one")).totalSize());
// Fails with UnsupportedOperationException
// "can't get field offset on a record class: private final int Outer$B.value"
// sun.misc.Unsafe.objectFieldOffset - line 648
System.out.println(GraphLayout.parseInstance(new B(1, "one")).totalSize());
}
public static class A {
int value;
String name;
public A(int value, String name) {
this.value = value;
this.name = name;
}
}
public static record B(int value, String name) {
}
}
我做了一些搜索,以寻找将Jol与Java Records结合使用的示例,但没有找到任何东西.目前,使用我可能遗漏的一些配置设置,Jol是否可以做到这一点?