JEP 295 AOT: объекты скомпилированы несколько раз

Я пытаюсь скомпилировать сервер приложений с новой функцией AOT в JDK9 и столкнулся с рядом проблем.

Сервер приложений состоит из ~180 МБ банок; компиляция, которая вместе переполняет целое число, поэтому я попытался скомпилировать каждый модуль в одну (.so) библиотеку. Эти модули имеют зависимости от других модулей, поэтому мне пришлось поместить их в путь к классам, используя -J-cp -J зависимости. Это привело к 4,4 ГБ библиотек - поскольку AOT должен ускорить загрузку сервера, вы можете себе представить, что загрузка этого с диска не очень помогает. (Можно лишить эти библиотеки информации об отладке, но мы все еще говорим о порядке увеличения масштаба по сравнению с jar-файлами.)

Я был довольно разочарован тем, что jaotc на самом деле класс загружает скомпилированные классы, что вызывает статические конструкторы (и это иногда дает мне ошибки). Также компилятор не может обрабатывать пропущенные классы, на которые ссылаются, и иногда это просто зависимость во время выполнения - сервер работает без проблем, даже без них. Поэтому мне пришлось предоставить пустые фиктивные классы для удовлетворения компилятора.

Однако при запуске сервера с отслеживанием AOT (-Xlog:aot+class+load=trace:file=/tmp/aot.txt:none не стандартный вывод -XX:+PrintAOT) Я обнаружил, что библиотеки также содержат некоторую часть зависимостей:

found  java.lang.Object  in  /home/user/aot/common/libjava.base-coop.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
found  java.lang.Object  in  /home/user/aot/appserver/lib/libcom.example.module1.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
found  java.lang.Object  in  /home/user/aot/appserver/lib/libcom.example.module2.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800

Это подтвердило мои сомнения, что библиотека содержит больше, чем просто код из jar-файлов, которые я дал компилятору для компиляции, но, по крайней мере, код для суперклассов. Я также не уверен, как ведет себя JVM, когда находит один и тот же класс в нескольких библиотеках.

Можно ли убрать дубликаты? Каков рекомендуемый подход к большим / мультибиблиотечным проектам?

2 ответа

Эта функция была удалена JEP410 . Код, относящийся к AOT, в основном удален в JDK 17, вы не должны использовать эту функцию. Если вам все еще нужна эта функция, вы можете рассмотреть возможность использования GraalVM .

Рекомендуемый подход для работы с мульти-баночными зависимостями в Java 9 - Модули и модульные баночки.

Чем больше библиотек jar модульно, тем меньше компилятор может получить конечный результат.

https://www.oracle.com/corporate/features/understanding-java-9-modules.html

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