Можете ли вы использовать jaotc (Java Ahead-of-Time Compiler) с jlink (сборщик / оптимизатор модулей для создания образов времени выполнения)?

Целью здесь является:

  1. Создайте образ во время выполнения, который имеет свой собственный JRE (уменьшенный размер) - это то, что дает нам jlink

  2. Создавайте нативно исполняемые библиотеки вместо использования байт-кода (улучшите время загрузки и, надеюсь, избавите от необходимости запутывать) - это то, что дает нам 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 команда.

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