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

В приложении участились длинные паузы full GC, при этом старое поколение почти всегда заполнено. О чём это говорит?

MiddleJVM и сборка мусора
Ещё спрашивают так:
  • Идут постоянные full GC, и старое поколение растёт после каждого цикла. В чём причина?
  • Идут постоянные full GC, и old растёт после каждого цикла. Наиболее вероятная причина?
Коротко

Живых данных больше, чем помещается. Смотрят на занятость после каждого full GC: ползёт вверх — утечка, держится высоко, но стабильно — кучи мало под рабочий набор. Лечат причину, а не добавлением памяти.

  • Утечку ищут по heap dump: доминаторы в Eclipse MAT
  • -XX:+HeapDumpOnOutOfMemoryError — дамп в момент падения
  • Третья причина — преждевременное продвижение при малом Survivor

А ещё Больше кучи при утечке лишь отсрочит падение и удлинит паузы

Попробуйте сами

GC: Eden, Survivor и продвижение

Подробно

Отличать причины помогает форма графика занятости кучи после сборок: если уровень после каждого full GC ползёт вверх и не возвращается, это утечка; если держится высоко, но стабильно — кучи просто мало под рабочий набор. Стоимость full GC определяется объёмом живых данных, поэтому увеличение кучи без устранения утечки лишь удлиняет паузы. Порядок действий на собеседовании стоит назвать так: снять heap dump и найти, что удерживает память, проверить преждевременное продвижение из молодого поколения, и только потом крутить размеры и менять сборщик. Смена сборщика меняет распределение пауз, но не спасает от нехватки памяти.

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

  • Различение утечки и нехватки по форме графика.
  • Инструменты: heap dump, доминаторы.
  • Почему увеличение кучи не решение.

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

  • Наращивать кучу, не разобравшись, утечка это или рабочий набор.
  • Ждать, что смена сборщика решит проблему нехватки памяти.

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

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

Показать варианты и ответ
  • ✗Проблема всегда решается сменой сборщика на параллельный
  • ✓Живые данные не помещаются: утечка памяти или слишком маленькая куча
  • ✗Нужно уменьшить молодое поколение, чтобы minor GC шёл чаще
  • ✗Это нормальное поведение при высокой нагрузке и не требует внимания

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

  • Как по графику занятости кучи отличить утечку от нехватки памяти?
  • Какие типичные структуры удерживают память дольше нужного?
  • Что такое premature promotion?
  • Как снять и читать heap dump?

Разбор темы

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

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

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

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

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