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

Согласно JEP 295

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

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

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

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

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.

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


если 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.

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