Я отсылаю вас к сообщению Мэтью Джиллиарда (mjg) в блоге на эту тему.Любые примеры кода ниже идут прямо оттуда.Я не буду приводить примеры хронометража, частично, чтобы сделать это коротким, а частично, чтобы побудить вас посетить его страницу.Мэтью работает над Fn Project , поэтому ему очень интересно выяснить, как сохранить время запуска на низком уровне.
По-видимому, есть несколько способов сделать это, а некоторые довольно просты.Основная идея заключается в том, что вы кэшируете цикл инициализации JVM вместо того, чтобы выполнять его при каждом запуске.
Класс обмена данными ( CDS )
CDS кэширует детерминированный (аппаратно-зависимый) процесс запуска JDK.Это самый простой и самый старый (с версии 1,5) трюк в книге (и не очень известный).
Из Oracle
Когда JVMзапускается, общий архив сопоставляется с памятью, что позволяет совместно использовать метаданные JVM только для чтения для этих классов между несколькими процессами JVM.Время запуска сокращается, что экономит затраты, поскольку восстановление общего архива происходит быстрее, чем загрузка классов.
Вы можете создать дамп вручную, выполнив
⇒ java -Xshare:dump
Allocated shared space: 50577408 bytes at 0x0000000800000000
Loading classes to share ...
// ...snip ...
total : 17538717 [100.0% of total] out of 46272512 bytes [ 37.9% used]
...и затем используйте его с
java -Xshare:on HelloJava
AOT : Компиляция в ожидании времени (Java 9 +)
Из блога mjg
Если CDS заранее выполняет некоторые части загрузки классов ядра, AOT фактически компилирует байт-код в собственный код (файл общего объекта в формате ELF) и может применяться к любому байт-коду.
Использование SubstrateVM (Java 8 +)
Не в блоге, но продемонстрировано во время выступления, которое он дал несколько дней назад.
Из файла readme :
Substrate VM - это инфраструктура, которая позволяет заранее (AOT) компилировать приложения Java в предположении закрытого мира в исполняемые образы или общие объекты (ELF-64)или 64-битный Mach-O).