0Pricing
Java Academy · Урок

Распространённые флаги настройки 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 — локальная установка не требуется.

Все уроки этого курса

  1. Выявление узких мест
  2. Java Flight Recorder
  3. Анализ с помощью JDK Mission Control
  4. Распространённые флаги настройки JVM
← Назад к Java Academy