Приходилось ли настраивать параметры запуска JVM для тюнинга памяти
Что проверяют
Шли ли вы от измерений или подставляли флаги из статьи. Тема легко проверяется одним уточнением, поэтому отвечать надо тем, что действительно делали. Следом спрашивают, какие метрики смотрели до и после и как менялись паузы сборщика.
Как отвечать
Стройте рассказ цепочкой: симптом, измерение, гипотеза, изменение, проверка.
- симптом:
OutOfMemoryError, рост потребления до перезапуска контейнера, длинные паузы, деградация к вечеру под нагрузкой; - измерение: логи сборщика через
-Xlog:gc*:file=gc.log:time,uptime,level,tags, дамп по-XX:+HeapDumpOnOutOfMemoryErrorс разбором в Eclipse MAT, запись JFR флагом-XX:StartFlightRecordingи просмотр в JDK Mission Control,jcmd <pid> GC.heap_info, а для памяти вне кучи-XX:NativeMemoryTracking=summaryвместе сjcmd VM.native_memory; - параметры:
-Xmsравен-Xmx, чтобы куча не разъезжалась в рантайме. В контейнере удобнее-XX:MaxRAMPercentage=75, потому что по умолчанию JVM берёт под кучу четверть лимита cgroup. Плюс-XX:MaxMetaspaceSize,-XX:MaxDirectMemorySize,-Xssдля сервисов с тысячами потоков; - сборщик: по умолчанию G1, целевая пауза задаётся
-XX:MaxGCPauseMillisи равна 200 мс. Для больших куч и жёстких требований к задержке берут ZGC (-XX:+UseZGC, поколенческий), для пакетной обработки с упором на пропускную способность годится ParallelGC.
Главная мысль: флаг это последний шаг. Чаще выигрыш даёт код, кеш без ограничения размера или лишние аллокации в горячем цикле.
Опыта нет, скажите прямо: жили на настройках по умолчанию, памяти хватало, метрики смотрели в Grafana. Дальше опишите план: снять логи сборщика и дамп, найти, что держит кучу, и только потом трогать флаги.
Где спотыкаются
Перечисляют набор времён Java 8 вместе с CMS. Этот сборщик удалён в JDK 14, а PermSize исчез ещё раньше.
Ставят -Xmx равным лимиту памяти контейнера. Метаспейс, стеки потоков, кеш кода и прямые буферы лежат вне кучи, процесс убивает ядро, и в логах приложения не остаётся ничего.
Лечат флагами утечку. Если после каждой полной сборки занято всё больше, помогает не увеличенный -Xmx, а поиск того, кто держит ссылки.