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, стеки потоков).