Циклические ссылки сами по себе не мешают GC: важна достижимость от GC roots. Но System.gc() не гарантирует освобождение объектов именно в этом месте программы.
Влияние циклических ссылок на работу сборщика мусора
Циклические ссылки сами по себе не мешают GC: важна достижимость от GC roots. Но System.gc() не гарантирует освобождение объектов именно в этом месте программы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Исследуем, сможет ли сборщик мусора освободить объекты типа X и Y, когда они ссылаются друг на друга в цикле.
public class Main {
public static void main(String[] args) {
X objX = new X();
Y objY = new Y();
objX.y = objY;
objY.x = objX;
// Будут ли освобождены объекты X и Y?
System.gc();
}
}
Ответ
Циклические ссылки сами по себе не мешают GC: важна достижимость от GC roots. Но System.gc() не гарантирует освобождение объектов именно в этом месте программы.
Пока существует живая сильная внешняя ссылка на X или Y, достижим весь цикл. В данном фрагменте локальные ссылки явно не обнулены, но после связывания больше не используются: оптимизация JVM может завершить их живость раньше конца метода. Поэтому нельзя обещать ни обязательное сохранение до выхода из main, ни немедленную сборку. Для искусственного удержания объекта до выбранной точки существует Reference.reachabilityFence; для обычного кода специально разрывать такие циклы не требуется.
Источник: docs.oracle.com.