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