Можете ли вы использовать jaotc (Java Ahead-of-Time Compiler) с jlink (сборщик / оптимизатор модулей для создания образов времени выполнения)?
Целью здесь является:
Создайте образ во время выполнения, который имеет свой собственный JRE (уменьшенный размер) - это то, что дает нам jlink
Создавайте нативно исполняемые библиотеки вместо использования байт-кода (улучшите время загрузки и, надеюсь, избавите от необходимости запутывать) - это то, что дает нам jaotc
Тем не менее, нет никакой хорошей документации, которая соотносит их. Кажется, есть много противоречивых способов сделать что-то с этими двумя потоками.
Можно ли создать образ времени выполнения с помощью jlink, использующей двоичные файлы, сгенерированные jaotc?
1 ответ
На самом деле, нет. Ни один JEP-295 (Jaotc) не упоминает jlink
ни в JEP-282 (jlink) не упоминается jaotc
,
Тем не менее, потому что jlink
просто создает урезанный JRE (но это все еще JRE!) с кодом вашего приложения, можно сказать, что он использует библиотеки AOT-ed, которые вы хотите.
Я решил следовать процедуре, чтобы создать собственную библиотеку AOT для java.base
модуль, как описано в JEP-295, затем изменил jlink
Пусковая установка в bin/my-app
установив JLINK_VM_OPTIONS
следующее:
JLINK_VM_OPTIONS=-XX:AOTLibrary=./libjava.base-coop.so
Затем я запустил мой пусковой time bin/my-app
, который делает HTTP-запрос к серверу на локальном хосте (чтобы избежать задержки в сети), а затем печатает полный HTTP-ответ.
Это занимает около 410 мс с AOT и 210 мс без него!
Чтобы подтвердить правильность выбора AOT, я добавил несколько диагностических флагов:
JLINK_VM_OPTIONS="-XX:+UnlockDiagnosticVMOptions -XX:AOTLibrary=./libjava.base-coop.so -XX:+UseAOTStrictLoading"
Он не показал никаких ошибок или предупреждений, поэтому я считаю, что не совершил какую-то ошибку, которая могла бы исказить результаты.
В заключение, по крайней мере, в моем случае, смешивание jlink
а также jaotc
не оказывает положительного влияния, но обратите внимание, что в jaotc
JEP они говорят, что:
AOT compilation of any JDK modules, classes, or of user code,
is experimental and not supported in JDK 9
Итак, я бы сказал, что еще слишком рано (май 2018 года, на момент написания статьи) судить об этом... давайте дадим им время для совершенствования этого механизма и надеемся, что они смогут добиться большего улучшения.
На данный момент более многообещающим способом ускорения ваших приложений может быть использование GraalVM и его native-image
команда.