В приложении участились длинные паузы full GC, при этом старое поколение почти всегда заполнено. О чём это говорит?
- Идут постоянные full GC, и старое поколение растёт после каждого цикла. В чём причина?
- Идут постоянные full GC, и old растёт после каждого цикла. Наиболее вероятная причина?
Живых данных больше, чем помещается. Смотрят на занятость после каждого full GC: ползёт вверх — утечка, держится высоко, но стабильно — кучи мало под рабочий набор. Лечат причину, а не добавлением памяти.
- Утечку ищут по heap dump: доминаторы в Eclipse MAT
- -XX:+HeapDumpOnOutOfMemoryError — дамп в момент падения
- Третья причина — преждевременное продвижение при малом Survivor
А ещё Больше кучи при утечке лишь отсрочит падение и удлинит паузы
Подробно
Отличать причины помогает форма графика занятости кучи после сборок: если уровень после каждого full GC ползёт вверх и не возвращается, это утечка; если держится высоко, но стабильно — кучи просто мало под рабочий набор. Стоимость full GC определяется объёмом живых данных, поэтому увеличение кучи без устранения утечки лишь удлиняет паузы. Порядок действий на собеседовании стоит назвать так: снять heap dump и найти, что удерживает память, проверить преждевременное продвижение из молодого поколения, и только потом крутить размеры и менять сборщик. Смена сборщика меняет распределение пауз, но не спасает от нехватки памяти.
Что хотят услышать
- Различение утечки и нехватки по форме графика.
- Инструменты: heap dump, доминаторы.
- Почему увеличение кучи не решение.
Частые ошибки
- Наращивать кучу, не разобравшись, утечка это или рабочий набор.
- Ждать, что смена сборщика решит проблему нехватки памяти.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Проблема всегда решается сменой сборщика на параллельный
- ✓Живые данные не помещаются: утечка памяти или слишком маленькая куча
- ✗Нужно уменьшить молодое поколение, чтобы minor GC шёл чаще
- ✗Это нормальное поведение при высокой нагрузке и не требует внимания
Что спросят дальше
- Как по графику занятости кучи отличить утечку от нехватки памяти?
- Какие типичные структуры удерживают память дольше нужного?
- Что такое premature promotion?
- Как снять и читать heap dump?
Разбор темы
- GC: поколения и продвижение объектов
Гипотеза о поколениях, Eden и Survivor, minor GC через копирование, tenuring и преждевременное продвижение.
- GC: тюнинг и мониторинг
Ключевые флаги, unified GC-логи, метрики (паузы, throughput, allocation/promotion rate) и диагностика частых проблем.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.