Как сбор мусора собирает самореферентные объекты?

Если объект не ссылается никаким другим, он может быть собран сборщиком мусора .NET CLR.

Однако, если objA ссылается на objB, objB указывает objC, а objC ссылается на objA, как сборщик мусора выясняет, что они (в целом) могут быть собраны

Ответ 1

В CLR используется метод, известный как mark-and-sweep.

Как часть этого метода, каждый объект можно рассматривать как первоначально обозначенный для коллекции. Затем CLR проходит через каждый доступный объект, начиная с ваших глобалов (статические поля и т.д.) В качестве корней, и очищает метку на каждом доступном объекте. Затем он отображает оставшиеся отмеченные объекты.

Имейте в виду, что эта "маркировка" концептуальна; в действительности, объекты, скорее всего, добавлены в набор коллекции.

В случае зацикливания объектов с самопересечением ссылка на объекты не будет найдена в приложении, поэтому алгоритм никогда не достигнет этих объектов, чтобы их "развязать".

Ответ 2

GC имеет список всех созданных объектов. Во время процесса garbarge он начинается с глобальных корней (например, статических полей) и проходит через каждый объект, на который делается ссылка. Каждый объект из списка всех, которые не были удалены, может быть уничтожен.

Если нет возможности ударить objA, objB или objC, все эти объекты будут собраны