Как сборщик мусора собирает самоссылающиеся объекты? - PullRequest
12 голосов
/ 13 декабря 2011

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

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

Ответы [ 2 ]

8 голосов
/ 13 декабря 2011

CLR использует технику, известную как разметка и разметка.

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

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

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

2 голосов
/ 13 декабря 2011

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

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

...