我正在尝试使用 Java 对象布局 ( JOL ) 来测量保存某些 Java 记录实例的对象的实例大小。使用 时,我收到一个UnsupportedOperationException描述为“无法获取记录类上的字段偏移量”的信息GraphLayout.parseInstance。我在使用时遇到同样的错误ClassLayout.parseClass。
我最初使用的是 Java 20,但已降级到 Java 17。我尝试了 JOL 的最后两个版本(0.17 和 0.16)。我尝试了堆栈跟踪中的建议“无法获取字段偏移,请尝试使用 -Djol.magicFieldOffset=true”。看起来 Unsafe 中的记录不受支持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 …Run Code Online (Sandbox Code Playgroud)