Какие объекты удаляет сборщик мусора?
- Как сборщик мусора определяет, что объект не нужен?
- Что такое GC roots?
- Бывают ли утечки памяти в Java?
- Какие объекты освобождает сборщик мусора?
Удаляются недостижимые от корней объекты: сборщик обходит граф ссылок от GC roots, всё, до чего не дошёл, — мусор.
- Корни: локальные переменные активных потоков, статические поля, JNI-ссылки
- Циклические ссылки утечек не создают — недостижимый цикл будет собран
А ещё Утечка в Java — объект не нужен, но ещё достижим: растущий кэш, неотписанный слушатель, ThreadLocal в пуле
Подробно
Java не считает ссылки на объекты, как это делают некоторые другие языки. Сборщик мусора определяет живые объекты по достижимости: начинает с набора корней (GC roots) и обходит граф ссылок. Корни — это локальные переменные и параметры в стеках живых потоков, статические поля загруженных классов, ссылки из нативного кода. Всё, до чего обход дошёл, — живое; остальное можно освободить.
Следствия:
- циклические ссылки не мешают сборке — если группа объектов ссылается друг на друга, но до неё нельзя дойти от корней, она будет собрана;
- время жизни объекта и момент сборки не связаны — объект может стать мусором сразу, а собран будет позже, когда сборщику понадобится место.
Отсюда природа утечек памяти в Java: объект логически больше не нужен, но остаётся достижимым. Частые причины:
- статическая коллекция или кэш, которые только растут;
- слушатели и подписки, от которых не отписались;
ThreadLocal, не очищенный в пуле потоков;- незакрытые ресурсы.
Искать утечки помогает дамп кучи (heap dump) и анализ, кто удерживает объекты.
Что хотят услышать
- Критерий — достижимость от корней, а не подсчёт ссылок.
- Что такое GC roots.
- Почему циклы не проблема.
- Природа утечек в Java с примерами.
Частые ошибки
- Считать, что в Java используется подсчёт ссылок.
- Полагать, что присваивание null всегда освобождает память.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Те, у которых счётчик ссылок стал равен нулю
- ✗Те, которые не использовались дольше заданного времени
- ✗Те, которые программист явно пометил для удаления
- ✓Недостижимые по ссылкам от корней
Что спросят дальше
- Что относится к корням достижимости?
- Почему циклические ссылки не мешают сборщику?
- Что такое GC roots?
- Чем мягкая ссылка отличается от слабой?
Разбор темы
- GC: поколения и продвижение объектов
Гипотеза о поколениях, Eden и Survivor, minor GC через копирование, tenuring и преждевременное продвижение.
- GC: корни, достижимость и типы ссылок
GC roots и reachability, strong/soft/weak/phantom-ссылки, Cleaner вместо finalize и утечки через сильные ссылки.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.