Что произойдет со сборщиком мусора, если объект содержит ссылку на самого себя?

«Что произойдет со сборщиком мусора, если объект содержит ссылку на самого себя?» — вопрос из категории Управление памятью, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Современные сборщики мусора (GC), такие как в .NET или JVM, корректно обрабатывают циклические ссылки, включая самоссылки. Алгоритм mark-and-sweep определяет достижимость объектов, начиная от корневых ссылок (например, статических полей, локальных переменных в стеке, ссылок в регистрах CPU). Если объект с самоссылкой недостижим из любого корня, он будет помечен как мусор и удален.

Пример в C#:

public class Node
{
    public Node SelfReference { get; set; }
}

// Создание и изоляция объекта с самоссылкой
var node = new Node();
node.SelfReference = node; // Циклическая ссылка
node = null; // Объект больше не достижим из корней

// При следующей сборке мусора объект будет удален,
// несмотря на внутреннюю ссылку на себя.

Почему это работает: GC обходит граф объектов, помечая все, что достижимо из корней. Недостижимые циклы ("острова изоляции") не помечаются и в фазе очистки (sweep) освобождаются. Это фундаментальное свойство алгоритмов сборки мусора, основанных на достижимости.