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

Какие объекты удаляет сборщик мусора?

JuniorJVM и сборка мусора
Ещё спрашивают так:
  • Как сборщик мусора определяет, что объект не нужен?
  • Что такое GC roots?
  • Бывают ли утечки памяти в Java?
  • Какие объекты освобождает сборщик мусора?
Коротко

Удаляются недостижимые от корней объекты: сборщик обходит граф ссылок от GC roots, всё, до чего не дошёл, — мусор.

  • Корни: локальные переменные активных потоков, статические поля, JNI-ссылки
  • Циклические ссылки утечек не создают — недостижимый цикл будет собран

А ещё Утечка в Java — объект не нужен, но ещё достижим: растущий кэш, неотписанный слушатель, ThreadLocal в пуле

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

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

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

Подробно

Java не считает ссылки на объекты, как это делают некоторые другие языки. Сборщик мусора определяет живые объекты по достижимости: начинает с набора корней (GC roots) и обходит граф ссылок. Корни — это локальные переменные и параметры в стеках живых потоков, статические поля загруженных классов, ссылки из нативного кода. Всё, до чего обход дошёл, — живое; остальное можно освободить.

Следствия:

  • циклические ссылки не мешают сборке — если группа объектов ссылается друг на друга, но до неё нельзя дойти от корней, она будет собрана;
  • время жизни объекта и момент сборки не связаны — объект может стать мусором сразу, а собран будет позже, когда сборщику понадобится место.

Отсюда природа утечек памяти в Java: объект логически больше не нужен, но остаётся достижимым. Частые причины:

  • статическая коллекция или кэш, которые только растут;
  • слушатели и подписки, от которых не отписались;
  • ThreadLocal, не очищенный в пуле потоков;
  • незакрытые ресурсы.

Искать утечки помогает дамп кучи (heap dump) и анализ, кто удерживает объекты.

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

  • Критерий — достижимость от корней, а не подсчёт ссылок.
  • Что такое GC roots.
  • Почему циклы не проблема.
  • Природа утечек в Java с примерами.

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

  • Считать, что в Java используется подсчёт ссылок.
  • Полагать, что присваивание null всегда освобождает память.

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

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

Показать варианты и ответ
  • ✓Те, до которых больше нельзя добраться по ссылкам от корней — живых потоков, статических полей и подобных точек входа
  • ✗Те, которые не использовались дольше заданного времени
  • ✗Те, у которых счётчик ссылок стал равен нулю
  • ✗Те, которые программист явно пометил для удаления

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

  • Что относится к корням достижимости?
  • Почему циклические ссылки не мешают сборщику?
  • Что такое GC roots?
  • Чем мягкая ссылка отличается от слабой?

Разбор темы

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

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

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

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

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