Доступна ли предварительная компиляция в 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.