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

Ответ

Настройка 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) для анализа узких мест.

Ответ 18+ 🔞

А, настройка JVM, говоришь? Ну это ж святое, блядь! Это как двигатель в тачке подкрутить, только вместо лошадиных сил тут мегабайты и гигагерцы, нахуй. Слушай сюда, сейчас разжую.

Вот смотри, первое дело — память, она же куча, она же Heap. Тут главное не пролететь, как фанера над Парижем. Ставишь -Xms и -Xmx. И сделай их, блядь, одинаковыми, ёпта! Чтобы эта стерва JVM не тратила время на раскачку, типа "ой, мне мало, дайте ещё". Сразу дай столько, сколько можешь, и пусть сидит ровно. Как в тюрьме: получил паёк и не пищи.

-Xms2g  # Сразу влей два гига, пусть знает
-Xmx4g  # А больше четырёх — ни-ни, сожрёт всё, сука
-XX:MaxMetaspaceSize=512m # А это для её мозгов (классы там всякие), чтоб не раздувалась
-XX:MaxDirectMemorySize=1g # Память для разной шушеры в обход кучи, лимит ей, лимит!

Дальше — сборщик мусора, он же GC. Тут, брат, выбор как в борделе: каждый для своих утех.

  • Хочешь, чтобы приложение не тормозило, а отклик был быстрый? — Бери G1, скажи ему "больше 200 миллисекунд не думай, блядь!"
    -XX:+UseG1GC -XX:MaxGCPauseMillis=200
  • Нужно просто впахать кучу работы, а на мелкие тормоза похуй? — Врубай Parallel, пусть пашет в несколько потоков, как зек на лесоповале.
    -XX:+UseParallelGC
  • А если у тебя приложение — монстр, аж 64 гига памяти жрёт, и паузы вообще недопустимы? Тогда, сука, welcome в будущее. ZGC или Shenandoah. Они хоть и экспериментальные ещё местами, но паузы сокращают до смешного. Рисковый? Вперёд.
    -XX:+UseZGC # или -XX:+UseShenandoahGC

Теперь, самое весёлое — когда всё ебётся. OutOfMemoryError вылез, приложение накрылось медным тазом. Что делать? Правильно, надо знать, КТО ВИНОВАТ. Для этого включаем снюс-бокс, прости, дамп-бокс.

# Когда память кончится — вывали на диск всю эту помойку, чтоб потом разобраться
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof

# А чтобы понять, что сборщик мусора творил перед смертью, логируй его похождения подробно
-Xlog:gc*,gc+age=trace,safepoint:file=gc.log:time,uptime,level,tags:filecount=5,filesize=10m

# Ну и конечно, джентльменский набор — JMX. Включи, открой порт, и смотри из джконсоли, как твоё детище пыхтит.
-Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

И напоследок, лайфхаки от бывалых:

-XX:+UseContainerSupport # Это если в докере сидишь. Без этой штуки JVM может не увидеть лимиты и сожрать всю память хоста, пидарас.
-XX:ActiveProcessorCount=4 # Скажи ей прямо, сколько ядер у тебя есть. А то она начнёт считать сама и насчитает овердохуища.
-Dfile.encoding=UTF-8 # А то вылезут кракозябры вместо русских букв, и будешь потом ебаться.

И главное, ёпта, запомни: НИКОГДА НЕ НАСТРАИВАЙ НА ПРОДЕ ТО, ЧЕГО НЕ ПРОВЕРИЛ ПОД НАГРУЗКОЙ! Запусти стресс-тест, посмотри в профайлере (Async Profiler — отличная штука), где узкое место. А то настроишь красоту, а оно в реальности встанет колом. Удачи, не проеби!