Вопрос по сборке мусора в .NET - PullRequest
0 голосов
/ 08 июля 2010

Я думаю, что мой вопрос может быть связан с этим вопросом здесь , но я все равно задам его!

Если у меня есть три объекта: A, B и C, где

A ссылки B Ссылки C B ссылки C (и наоборот, циклический)

Будет ли ссылка B-> C приводить к тому, что A не будет собирать мусор, если он мог бы быть собран в противном случае?

Ответы [ 3 ]

5 голосов
/ 08 июля 2010

Ответы на вопрос, который вы связали, объясняют это хорошо. Сборщик мусора предназначен для работы с объектами, которые обращаются друг к другу в цикле.

Если ваши три объекта ссылаются друг на друга, и ни один другой объект не ссылается ни на один из них, тогда весь цикл пригоден для сбора.

0 голосов
/ 08 июля 2010

GC будет собирать любой объект, на который не ссылается корневой объект.Корневыми объектами обычно являются объекты, на которые ссылаются все домены приложений (т. Е. Загруженные сборки / объекты типа), глобальные и статические ссылки на объекты, все ссылки на объекты в соответствующем стеке каждого потока плюс любая ссылка на объект, в настоящее время загруженная в регистр ЦП.

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

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

Обычно вам не нужно думать об этом, простоработает.Но есть еще много возможностей для сбора мусора, и вам все равно нужно понимать его основы, чтобы понимать управление памятью и писать код без ошибок, который не пропускает ресурсы и т. Д. Поэтому каждый разработчик .NET должен обратить на это внимание.Вот несколько ресурсов, которые объясняют больше о том, как CLR выполняет сборку мусора.

MSDN - Основы сборщика мусора и Советы по производительности (Рико Мариани)

MSDNЖурнал - Сборка мусора (часть 1): Автоматическое управление памятью в Microsoft .NET Framework (Джеффри Рихтер)

Журнал MSDN - Сборка мусора (часть 2): Автоматическое управление памятью в Microsoft.NET Framework (Джеффри Рихтер)

0 голосов
/ 08 июля 2010

Пока C не ссылается на A, A будет собирать мусор.Идея состоит в том, что, как только все ссылки на конкретный объект выходят из области действия или обнуляются / удаляются, GC начинает работать. Таким образом, хотя A ссылается на C, если обратное неверно, то C не может удерживать дескрипторA.

Редактировать : Хотя я только что прочитал, что вы сказали, что они также ссылаются друг на друга и наоборот.В этом случае он не будет GCed, как другие, упомянутые здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...