Ответ
Настройка 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 — отличная штука), где узкое место. А то настроишь красоту, а оно в реальности встанет колом. Удачи, не проеби!