Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем