Производительность запуска JVM может быть улучшена по-разному: CDS, прямое регулирование, пиннинг CPU и jlink (с JDK 9) могут быть хорошими вариантами. AOT (JDK 9, только для Linux) имеет некоторые грубые грани, но может быть настроен на то, чтобы помочь небольшим приложениям.
CDS
класса Обмен данными был разработан для клиента VM назад в 1,5 раза, но был значительно улучшен, так как работать на всех вариантах HotSpot (все ШС с 8), в результате чего существенный импульс запуска производительности при включен.
CDS всегда включен на 32-битных установках JRE клиента, но, возможно, потребуется несколько шагов вручную включить в других местах:
- Run
java -Xshare:dump
для генерации CDS общего архива
- Добавить
-Xshare:auto
вашей команды к убедиться, что он используется
Другие настройки
Хотя -client
может или не может фактически сделать anythi нг (виртуальная машина на многих системах не не поставляются с клиентской VM - ни с 9, на самом деле), существует множество способов настройки на HotSpot сервер JVM, чтобы вести себя как клиент VM:
- Используйте только С1 (клиент) компилятор:
-XX:TieredStopAtLevel=1
- Использование в качестве несколько компилятора нитея, как это возможно:
-XX:CICompilerCount=1
- Используйте однопоточный последовательные ОЕ:
-XX:+UseSerialGC
- использование Предела куча (особенно в больших системах), например,
-Xmx512m
Этого должно быть достаточно, чтобы ускорить запуск небольшого приложения с коротким сроком действия, но может иметь очень негативные последствия для максимальной производительности. Вы можете, конечно, получить еще больше, отключив функции, которые вы, возможно, не используете, например -XX:-UsePerfData
(отключает некоторую информацию о времени выполнения, которая может быть получена с использованием MXBeans и jvmstat).
Расширенный
jlink новый инструмент, доступный в Java 9, который позволяет создавать пользовательские среды выполнения изображений. Если ваше консольное приложение использует только небольшое подмножество модулей JDK, пользовательское время выполнения может быть сделано очень маленьким, что может улучшить время запуска. Минимальное изображение, включающее только java.базовый модуль, и может увеличить время запуска на ~ 10-20ms в зависимости от аппаратного обеспечения и другой настройки: $JAVA_HOME/bin/jlink --add-modules java.base --module-path $JAVA_HOME/jmods --output jbase
(Linux только) Java 9 вводит экспериментальную AOT compiler, jaotc
, которые могут быть использованы, чтобы помочь приложениям загружаться быстрее и тратить намного меньше циклов. Из-за коробки он может замедлить немедленный запуск (поскольку код AOT'd является общей библиотекой, которая добавляет свои собственные накладные расходы ввода-вывода, не поддерживает Serial GC ..), но при тщательной настройке мы, Видно, что он сокращает время запуска небольших приложений на 15-30%.
CPU pinning: на больших системах мы видели эффекты, которые возникают из-за трафика когерентности кеш-памяти между сокетами, а привязка к одному узлу CPU может значительно сократить время запуска. В Linux что-то вроде numactl --cpunodebind=0 $JAVA_HOME/bin/java ...
должно сделать трюк.
В целом мы смогли получить минимальные приложения для выполнения всего за 35 мс (JDK 9 GA). В ветку JDK10 вошли различные оптимизации запуска, и теперь я вижу цифры всего 28 мс.
По-видимому, это отложено до тех пор, пока JDK 8. (источник: http://openjdk.java.net/projects/jdk7/features/) – Calvin
Я действительно хочу, чтобы проект Монета или что-то, что они использовали для модуляции основных библиотек, не было всегда отталкиваясь назад. Мне бы хотелось увидеть сокращение кода базовой библиотеки, отбросив Enumeration и другие ранние ложные запуски. –
После «некоторого» времени он, наконец, подходит к Java 9: D – thatsIch