Это экспериментальная функция.
Чтобы ответить на последнюю часть вашего вопроса. 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