Gymterview
middle

Основные параметры JVM для настройки памяти

Параметры JVM — это флаги командной строки, управляющие размерами памяти, выбором сборщика мусора и диагностикой. Правильная настройка критична для стабильной работы приложения в production.

Параметры размера памяти

Параметр Описание Пример
-Xms Начальный размер heap -Xms512m
-Xmx Максимальный размер heap -Xmx4g
-Xss Размер стека потока -Xss512k
-Xmn Размер Young Generation -Xmn256m
-XX:MaxMetaspaceSize Максимальный размер Metaspace -XX:MaxMetaspaceSize=512m
-XX:MetaspaceSize Порог для первого GC Metaspace -XX:MetaspaceSize=256m

Параметры соотношений

Параметр Описание По умолчанию
-XX:NewRatio Соотношение Old/Young 2 (Young = 1/3 heap)
-XX:SurvivorRatio Соотношение Eden/Survivor 8 (S = 1/10 Young)
-XX:MaxTenuringThreshold Возраст для продвижения в Old 15

Параметры выбора GC

Пример
-XX:+UseSerialGC          # Serial GC
-XX:+UseParallelGC         # Parallel (Throughput) GC
-XX:+UseG1GC               # G1 GC (по умолчанию с Java 9)
-XX:+UseZGC                # ZGC
-XX:+UseShenandoahGC       # Shenandoah
-XX:+UseEpsilonGC          # Epsilon (no-op) GC

Параметры диагностики

Логирование GC и heap dump
# Логирование GC (Java 9+, Unified Logging)
-Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=5,filesize=100m

# Heap dump при OutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/dumps/

# Показать финальные значения всех флагов
-XX:+PrintFlagsFinal

# Native Memory Tracking
-XX:NativeMemoryTracking=summary

Параметры для контейнеров (Docker/Kubernetes)

Пример
# Использовать проценты от лимита контейнера (по умолчанию с Java 10+)
-XX:+UseContainerSupport

# Установить heap как процент от доступной памяти
-XX:MaxRAMPercentage=75.0
-XX:InitialRAMPercentage=50.0
-XX:MinRAMPercentage=25.0   # используется для маленьких heap
Типичная конфигурация для production
java \
  -Xms4g -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+UseStringDeduplication \
  -XX:MaxMetaspaceSize=512m \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/dumps/ \
  -Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags:filecount=5,filesize=100m \
  -jar application.jar
Типичная конфигурация для контейнера
java \
  -XX:+UseContainerSupport \
  -XX:MaxRAMPercentage=75.0 \
  -XX:+UseZGC \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/tmp/ \
  -Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags \
  -jar application.jar

Частые ошибки

  • -Xms намного меньше -Xmx — JVM тратит время на расширение heap под нагрузкой
  • Не установлен -XX:MaxMetaspaceSize — утечка загрузчиков классов может потребить всю память ОС
  • В контейнере задан -Xmx больше лимита контейнера — OOM Killer убивает процесс
  • Использование -XX:MaxRAMPercentage=100 — не остаётся памяти для Metaspace, native memory, thread stacks
  • Копирование production-конфигурации для локальной разработки — избыточное потребление ресурсов

На собеседовании: обязательно упомяните правило -Xms = -Xmx в production и -XX:+HeapDumpOnOutOfMemoryError. Для контейнеров покажите знание -XX:MaxRAMPercentage вместо фиксированного -Xmx. Частая ловушка — вопрос, почему нельзя ставить MaxRAMPercentage=100 (ответ: нужна память для Metaspace, native memory, стеки потоков).