Доступна ли предварительная компиляция в Java 9?

Согласно JEP 295

Компиляция AOT любых модулей, классов или пользовательского кода JDK является экспериментальной и не поддерживается в JDK 9.

Чтобы использовать модуль AOTed java.base, пользователю необходимо скомпилировать модуль и скопировать полученную библиотеку AOT в каталог установки JDK или указать ее в командной строке java.

Меня смущает приведенное выше утверждение: если AOT не поддерживается в JDK 9, как мы можем скомпилировать модуль с помощью AOT?

Мой второй вопрос: почему AOT не поддерживается в JDK 9, если у него много преимущества перед JIT?


person Mohit Tyagi    schedule 05.10.2017    source источник
comment
Что это за «много преимуществ перед JIT»? Ссылка не называет многих преимуществ.   -  person Holger    schedule 06.10.2017


Ответы (1)


Это экспериментальная функция.

Чтобы ответить на последнюю часть вашего вопроса. AOT не является полноценным с точки зрения совместимости с API Java 9. Некоторые из его ограничений также перечислены в связанном JEP:

  • Он по-прежнему ограничен 64-битными системами на базе Linux.

  • Чтобы использовать компиляцию AOT, пользователям необходимо использовать один и тот же JDK для компиляции и выполнения. Информация о версии jaotc, используемой для компиляции, добавляется как часть библиотек и проверяется во время загрузки. Если среда выполнения Java обновлена, вам необходимо перекомпилировать скомпилированные модули AOT перед их выполнением. Несовпадение версий JDK, используемых для компиляции и выполнения, может привести к сбою приложения.

  • Лямбда-выражения и другие сложные концепции Java, использующие динамически генерируемые классы во время выполнения, в настоящее время не поддерживаются компилятором AOT.

  • Для создания файлов общих объектов (.so) в системе должна быть предварительно установлена ​​libelf.

  • Режим логической компиляции для java.base является многоуровневым AOT, поскольку для достижения максимальной производительности требуется JIT-перекомпиляция java.base методов. Неуровневая компиляция AOT имеет смысл только в определенных сценариях. Это включает в себя приложения, требующие предсказуемого поведения, когда занимаемая площадь более важна, чем пиковая производительность, или для систем, в которых генерация динамического кода не разрешена. В этих случаях компиляция AOT должна выполняться для всего приложения и, таким образом, является экспериментальной в JDK 9.

Эти ограничения могут быть устранены в будущих выпусках, и именно тогда я уверен, что тег Experimental из функции будет удален.


если AOT не поддерживается в JDK 9, как мы можем скомпилировать модуль с помощью AOT?

Чтобы использовать AOT, код приложения должен быть скомпилирован с использованием компилятора jaotc с учетом некоторых ограничений, перечисленных выше. Как указано в Предварительная компиляция: использование AOT, если библиотека AOT была скомпилирована с использованием инструмент как:

jaotc --output libHelloWorld.so HelloWorld.class

его можно использовать на этапе выполнения

java -XX:AOTLibrary=./libHelloWorld.so HelloWorld

при условии, что конфигурации JVM одного и того же выпуска используются как во время компиляции, так и во время выполнения.

Как только выполнение запускается с помощью указанной выше команды, использование скомпилированных файлов AOT по по умолчанию включено. Чтобы указать, использовать ли эти файлы или нет, был введен новый аргумент, который можно использовать на этапе выполнения. то есть -

-XX:+/-UseAOT    

Что еще более важно, чтобы ответить на оба ваших вопроса выше и даже так, как четко указано в разделе Риски и предположения предложения:

Если пользователь обнаруживает, что приложение запускается медленнее, не достигает ожидаемой пиковой производительности или дает сбой, он может просто выключить AOT с помощью флага -XX:-UseAOT или удалить любые библиотеки AOT.

person Naman    schedule 05.10.2017
comment
Хорошее чтение с образцом, который я недавно нашел через Интернет. - person Naman; 05.10.2017
comment
В общем, поддерживаются и могут использоваться разные концепции. - person ; 03.04.2019