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

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

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

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

Однако при запуске сервера с трассировкой AOT (-Xlog:aot+class+load=trace:file=/tmp/aot.txt:none, не stdout -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, когда находит один и тот же класс в нескольких библиотеках.

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

Ответ 1

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

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

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