2013-02-11 2 views
4

У меня есть бинарное дерево реализуется в C# с помощью метода прозрачного(), которыйделает корень нуль, таким образом, удаляя ссылку на корневой узел в куче. Это делает корневой узел в куче подходящим для сбора мусора.Сбор мусора по удалению корня

Но во время цикла сбора мусора будет только корневой узел будет собран, а затем его двое дети будут иметь право на сбор мусора в следующем цикле и принимать стольких циклов, чтобы удалить дерево, как от глубины дерево или все дерево в куче будет собрано за один цикл?

ответ

3

Все дерево будет собрано, потому что GC находит за один цикл ВСЕ объекты, которые не могут быть достигнуты. Поскольку ни один из узлов вашего дерева не доступен (из какого-либо живого корня), весь набор узлов должен быть GCed.

Это эффективный способ работы GC - но это также хороший способ справиться с самореферентными структурами данных, такими как двусвязный список (что вызовет проблемы для любого алгоритма, который не учитывать «достижимость от некоторого достижимого корня»).

2

Фактически это зависит от того, как долго ваши объекты были живы.

.NET использует алгоритм с именем «mark & sweep», который описан here. Алгоритм в основном отмечает все для удаления, за исключением вещей, которые могут быть достигнуты. Здесь ваши объекты будут удалены на одной итерации.

Однако наивная отметка & будет охватывать много времени, так как большинство «долгоживущих» объектов выдержит GC. Чем более долговечные объекты у вас есть, тем больше времени потребуется GC для отметки всех объектов. Вот почему .NET отслеживает, сколько циклов GC выжил объект. Если он выживет пару раз, следующий GC пропустит объект. Они называются «поколениями» и описаны на MSDN. Проще говоря, больше времени, когда объект пережил цикл GC, чем менее часто он будет посещать сборщик мусора для его удаления.

Однако, как только ваша структура будет в какой-то момент отмечена как «не указана» GC, полная структура будет удалена за один проход.

Смежные вопросы