VM Options



— это параметры, которые указываются при запуске JVM. В этом посте расскажу, чем они отличаются, и как безопасно перейти на новую версию java. В конце будет список самых популярных (и полезных) опций.



Все JVM опции делятся на три группы:



⚙️ Стандартные

Пишутся через минус и поддерживаются всеми JVM.

Пример: -classpath, -server, -version



⚙️ Нестандартные

Начинаются на -Х и определяют базовые свойства JVM. Могут не работать во всех JVM, но если поддерживаются, то вряд ли удалятся.

Пример: -Xmx, -Xms



⚙️ Продвинутые

Начинаются на -ХХ и касаются внутренних механизмов JVM. Не поддерживаются всеми JVM, часто меняются и удаляются.

Пример: -XX:MaxGCPauseMillis=500



Некоторые продвинутые опции требуют дополнительных флажков. Для экспериментальных фич обязателен -XX:+UnlockExperimentalVMOptions. Многие фичи диагностики не заработают без -XX:+UnlockDiagnosticVMOptions



Количество опций часто меняется. В 11 версии OpenJDK 1504 опции, а в 17 на 200 опций меньше.



Цикл отключения опций не совсем стандартный. В обычном коде что-то помечается Deprecated, и спустя время удаляется. VM Options используют более длинный цикл:



🔸 Deprecate: функционал работает, при запуске появляется warning

🔸 Obsolete: функция не выполняется, JVM пишет предупреждения

🔸 Expired: JVM не запускается



Многие опции очень нестабильны и часто меняются. Чтобы безопасно обновить версию java, нужно проверить набор опций через JaCoLine . Он подсветит устаревшие или уже бесполезные опции.



Полезные опции для java 11

(да, недавно вышла java 20, но самая популярная версия всё ещё 11)



1️⃣ Память



▫️ Начальный размер хипа: -Xms256m в абсолютных значениях, -XX:InitialRAMPercentage=60 - в процентах от RAM

▫️ Максимальный размер хипа: -Xmx8g или -XX:MaxRAMPercentage=60

▫️ Снять heap dump при переполнении памяти: -XX:+HeapDumpOnOutOfMemoryError. Адрес выходного файла задаётся в -XX:HeapDumpPath



2️⃣ Сборщик мусора



▫️ Serial GC: -XX:+UseSerialGC

▫️ Parallel GC: -XX:+UseParalllGC

▫️ CMS: -XX:+UseConcMarkSweepGC

▫️ G1: -XX:+UseG1GC (вариант по умолчанию)

▫️ ZGC: -XX:+UnlockExperimentalVMOptions -XX:+UseZGC

▫️ Shenandoah: -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC



Вывести статистику сборщика при завершении работы: -XX:+UnlockDiagnosticVMOptions ‑XX:NativeMemoryTracking=summary ‑XX:+PrintNMTStatistics



Базовое логгирование коллектора: -Xlog:gc

Максимально информативное: -Xlog:gc*



3️⃣ Посмотреть все доступные опции

⚙️ Нестандартные: java -X

⚙️ Продвинутые: java -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal