Работает ли макет объектов 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 в конфигурациях запуска/отладки устранило проблему.

Gradle 7.4.1 с Java 17/19 через Intellij-плагин без проблем с размерами записей.

openjdk 19.0.2: Unsafe.java

Другие вопросы по тегам