Работает ли макет объектов Java с записями Java?
Я пытаюсь использовать макет объекта Java (JOL) для измерения размера экземпляра объекта, который содержит экземпляры некоторых записей Java. я получаюUnsupportedOperationException
с описанием «невозможно получить смещение поля в классе записи» при использованииGraphLayout.parseInstance
. Я получаю ту же ошибку при использованииClassLayout.parseClass
.
Изначально я использовал Java 20, но перешел на Java 17. Я попробовал две последние версии JOL (0,17 и 0,16). Я попробовал рекомендацию из трассировки стека: «Невозможно получить смещение поля, попробуйте с -Djol.magicFieldOffset=true». Похоже, записи не поддерживаются вHotspotUnsafe.fieldOffset
и особенно в строке 647 в Unsafe.
Вот пример класса, который проходит, и аналогичной записи, которая выдает исключение.
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, используя некоторые настройки конфигурации, которые я, возможно, пропустил?
2 ответа
Ответ: да, макет объекта Java работает с записями Java, и для него требуется опция
Я запускал код из IntelliJ и устанавливал параметр в текстовом поле аргументов программы вместо текстового поля vmoptions (которое мне нужно было добавить первым). Добавление опции в vmoptions в конфигурациях запуска/отладки устранило проблему.