Распространённые флаги настройки JVM
Параметры кучи, GC и JIT
«Распространённые флаги настройки JVM» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Зачем настраивать JVM?
JVM имеет разумные значения по умолчанию, но для требовательных служб иногда требуется настраивать размер кучи, сборщик мусора и поведение компилятора во время выполнения.
Настройка — последний этап: сначала профилируйте, исправьте код и только затем обращайтесь к флагам, когда это подтверждено измерениями.
Размер кучи: -Xms и -Xmx
Два наиболее распространённых флага задают границы кучи:
-Xms— начальный размер кучи.-Xmx— максимальный размер кучи.
Пример: java -Xms512m -Xmx2g MyApp. Установка -Xms равным -Xmx позволяет избежать пауз при изменении размера в долго работающих серверах.
Чтение значений по умолчанию
Можно узнать, какие значения выбрала JVM. Runtime предоставляет текущие значения кучи, а -XX:+PrintFlagsFinal выводит фактическое значение каждого флага.
В примере выводятся ограничения памяти работающей JVM.
public class Main {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
long mb = 1024 * 1024;
System.out.println("Max heap (Xmx): " + (rt.maxMemory() / mb) + " MB");
System.out.println("Total heap now: " + (rt.totalMemory() / mb) + " MB");
System.out.println("Free in heap: " + (rt.freeMemory() / mb) + " MB");
System.out.println("Available cores: " + rt.availableProcessors());
}
}Выбор сборщика
Современные JDK предлагают несколько сборщиков мусора:
-XX:+UseG1GC— сборщик по умолчанию; сбалансированный, на основе регионов.-XX:+UseZGC— сверхнизкие паузы, большие кучи.-XX:+UseParallelGC— максимальная пропускная способность, более длительные паузы.-XX:+UseSerialGC— однопоточный сборщик для небольших приложений и контейнеров.
Целевое время паузы G1
G1 — сборщик, ориентированный на время пауз. Вы задаёте ему цель, и он пытается её достичь:
-XX:MaxGCPauseMillis=200просит G1 удерживать паузы около 200 мс.
Это мягкая цель, а не гарантия. Слишком низкое значение заставляет сборщик чаще выполнять небольшие сборки и может снизить пропускную способность.
ZGC для низкой задержки
Когда длительность пауз должна оставаться менее миллисекунды даже при кучах размером в несколько гигабайт, используйте ZGC с параметром -XX:+UseZGC.
Он выполняет большую часть работы параллельно с потоками приложения. Компромисс заключается в несколько больших накладных расходах CPU и памяти по сравнению с G1. Это идеальный вариант для служб, чувствительных к задержке.
Журналирование сборки мусора
Чтобы настраивать сборку мусора, нужно её видеть. Включите унифицированное журналирование:
-Xlog:gc*:file=gc.log:time,uptime,level,tags
Эта команда записывает сведения о каждой сборке с временными метками и длительностью. Перед изменением любого флага загрузите журнал в средство просмотра (или JMC/JFR), чтобы обнаружить длительные или частые паузы.
Контейнеры и CPU
В контейнерах JVM считывает ограничения cgroup. По умолчанию для кучи используется доля ограничения памяти.
-XX:MaxRAMPercentage=75.0задаёт размер кучи как процент от памяти контейнера.-XX:ActiveProcessorCount=Nпереопределяет обнаруженное число CPU.
Это предотвращает чрезмерное выделение памяти, из-за которого оркестратор затем завершит процесс.
Флаги JIT и диагностики
Ещё несколько полезных флагов:
-XX:+HeapDumpOnOutOfMemoryError— сохраняет дамп кучи при OOM для последующего анализа.-XX:HeapDumpPath=/tmp— указывает, куда его записать.-XX:+PrintCompilation— показывает активность JIT-компиляции.
Они почти не создают дополнительных затрат, но помогают разобраться, когда что-то идёт не так.
Дисциплина настройки
Золотые правила работы с флагами:
- Изменяйте только один флаг за раз и повторно измеряйте результат относительно базового показателя.
- Не копируйте флаги вслепую из публикаций в блогах — они могут быть рассчитаны на устаревшую JVM.
- Большинству приложений нужны только
-Xmxи, возможно, выбор сборщика; значения по умолчанию подходят для большинства случаев.
Метапространство и потоки
Куча — не единственная область памяти:
-XX:MaxMetaspaceSizeограничивает область метаданных классов; без этого утечка при загрузке классов может исчерпать нативную память.-Xssзадаёт размер стека каждого потока; уменьшите его, если запускаете очень много потоков, и увеличьте при глубокой рекурсии.
Обычно эти параметры не требуют настройки, но знание о них помогает, когда проблема связана с нативной памятью, а не с кучей.
Быстрая проверка
Чем управляют флаги -Xms и -Xmx?
Итоги
Флаги, о которых стоит знать:
-Xms/-Xmxзадают границы размера кучи.- Выберите сборщик: G1 (по умолчанию), ZGC (малые паузы), Parallel (высокая пропускная способность).
- Задайте
-XX:MaxGCPauseMillisдля G1; включите-Xlog:gc*, чтобы наблюдать за работой сборщика. - Используйте
MaxRAMPercentageв контейнерах иHeapDumpOnOutOfMemoryErrorдля дополнительной защиты. - Изменяйте только один флаг за раз и измеряйте результат.
Часто задаваемые вопросы
Урок «Распространённые флаги настройки JVM» бесплатный?
Да — полный текст урока «Распространённые флаги настройки JVM» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Распространённые флаги настройки JVM»?
Параметры кучи, GC и JIT Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Распространённые флаги настройки JVM»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Выявление узких мест
- Java Flight Recorder
- Анализ с помощью JDK Mission Control
- Распространённые флаги настройки JVM