Какие ключевые параметры JVM требуют настройки?

«Какие ключевые параметры JVM требуют настройки?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Настройка JVM направлена на оптимизацию производительности и стабильности приложения. Основные категории параметров:

1. Управление памятью (Heap):

-Xms2g  # Начальный размер кучи (Heap). Рекомендуется равен максимальному.
-Xmx4g  # Максимальный размер кучи.
-XX:MaxMetaspaceSize=512m # Лимит для Metaspace (классы, методы).
-XX:MaxDirectMemorySize=1g # Лимит для внекучевой памяти (NIO).

Почему -Xms = -Xmx? Чтобы избежать затрат на динамическое расширение кучи во время работы.

2. Выбор сборщика мусора (Garbage Collector):

# Для приложений с низкими задержками (Latency):
-XX:+UseG1GC -XX:MaxGCPauseMillis=200

# Для высокой пропускной способности (Throughput):
-XX:+UseParallelGC

# Для очень больших куч (более 32ГБ) и минимальных пауз:
-XX:+UseZGC # или -XX:+UseShenandoahGC

3. Мониторинг и отладка:

# Создание дампа памяти при OutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof

# Подробное логирование работы GC
-Xlog:gc*,gc+age=trace,safepoint:file=gc.log:time,uptime,level,tags:filecount=5,filesize=10m

# Включение JMX для удалённого мониторинга (например, через JConsole, VisualVM)
-Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

4. Прочие важные настройки:

-XX:+UseContainerSupport # Корректное определение ресурсов в контейнерах (Docker/K8s)
-XX:ActiveProcessorCount=4 # Явное указание числа CPU для JVM
-Dfile.encoding=UTF-8 # Кодировка по умолчанию

Подход к настройке: Всегда тестируйте изменения под реалистичной нагрузкой. Используйте профилировщики (Async Profiler, Java Flight Recorder) для анализа узких мест.