Вопрос с собеседования · Java

В проде выросли задержки, подозрение на GC. Опиши порядок диагностики — от сбора данных до вывода.

SeniorJVM и сборка мусора
Коротко

Сначала данные: GC-логи (-Xlog:gc*) и метрики приложения — совпадают ли пики задержек с паузами вообще. Если да — частота и длительность пауз, доля времени в GC, allocation и promotion rate, живой набор после full GC. Лечить: код и размер кучи → сборщик → флаги, по одному изменению.

  • Частые minor GC — много мусора, лечится в коде
  • Старое растёт от сборки к сборке — утечка или маленькая куча
  • Много объектов сразу в старом — мал Survivor или порог tenuring

А ещё Часто GC ни при чём — виноват пул соединений или внешний вызов

Подробно

Главное в ответе — порядок, а не список флагов. Первым делом собираешь данные: unified-логи через -Xlog:gc*, плюс метрики приложения, чтобы понять, совпадают ли пики задержек с паузами вообще, — часто выясняется, что GC ни при чём и виноват пул соединений или внешний вызов. Если совпадают, смотришь четыре вещи: длительность и частоту пауз, суммарную долю времени в GC, темп аллокаций и темп продвижения в старое поколение, а также размер живого набора после полной сборки. Дальше диагнозы читаются почти однозначно. Частые короткие minor GC — приложение производит слишком много мусора, лечится в коде: лишние промежуточные коллекции, боксинг, строки в цикле. Старое поколение растёт от сборки к сборке, full GC учащаются, а живой набор после них не падает — утечка или просто маленькая куча. Много объектов уезжает в старое поколение сразу — маловат Survivor или порог tenuring. И порядок лечения: сначала код и размер кучи, потом выбор сборщика, флаги — в последнюю очередь и по одному изменению, с повторным замером.

Что хотят услышать

  • Порядок: данные, корреляция, диагноз, лечение.
  • Соответствие симптомов и причин.
  • Изменение одного параметра за раз.

Частые ошибки

  • Начинать с подбора флагов вместо сбора логов.
  • Менять несколько параметров сразу и не понимать, что помогло.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Сразу сменить сборщик на ZGC
  • ✗Увеличить кучу вдвое и посмотреть, станет ли лучше, затем поменять флаги сборщика и размер молодого поколения
  • ✗Снять дамп потоков и найти взаимную блокировку
  • ✓GC-логи и метрики, совпадение пиков с паузами, затем причина, и по одному изменению за раз

Что спросят дальше

  • Как отличить утечку памяти от недостаточного размера кучи?
  • Почему длинная пауза может быть вызвана не сборкой, а выходом на safepoint?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования