Что будет делать сборщик мусора в этом случае? - PullRequest
1 голос
/ 07 февраля 2012

Есть два сценария, которые я пытаюсь понять, как GC будет действовать

1- Существует два объекта - объект1 и объект2 объект1 имеет ссылку на объект2, а объект2 имеет ссылку на объект1 Теперь оба этих объекта не используются, и GC может собирать их.

Что будет? GC пропускает эту коллекцию?

2- Тот же вопрос, но у нас есть 4 (или n) объекта, которые имеют ссылку друг на друга. Что GC будет делать в этом случае ???

Ответы [ 5 ]

5 голосов
/ 07 февраля 2012

В отличие от COM, общеязыковая среда выполнения не использует подсчет ссылок для управления временем жизни объекта.Вместо этого сборщик мусора отслеживает ссылки на объекты и идентифицирует объекты, к которым больше нельзя получить доступ с помощью запуска кода.

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

http://msdn.microsoft.com/en-us/library/0t81zye4(v=vs.71).aspx

3 голосов
/ 07 февраля 2012

GC, используемый .NET, является трассирующим сборщиком мусора (термин "Mark and Sweep" - связанный термин)

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

Чтобы определить, что достижимо, а что нет, GC сначала устанавливает набор корневых ссылок / указателей.Это ссылки, которые гарантированно достижимы.Примеры включают локальные переменные и статические поля.

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

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

0 голосов
/ 07 февраля 2012

Дубликат Означает ли методология сбора мусора в CLR, что безопасно перебрасывать круглые ссылки на объекты? . GC .NET не является счетчиком ссылок, он просматривает все выделенные объекты и пытается связать их с корневым объектом GC. Он может обрабатывать и удалять эти циклические ссылки, независимо от того, сколько их существует.

0 голосов
/ 07 февраля 2012

Я не уверен, но вы можете просто попробовать это, создав огромное количество объектов (4 потока, заполнение списков), а затем обнулить списки. если баран падает, он знает, что больше нет ссылки на блок ссылочных объектов, если нет, то нет:)

0 голосов
/ 07 февраля 2012

AFAIK, GC будет собирать только те объекты, на которые больше нет ссылок на них. Так что, пока какой-то объект имеет ссылку на него, он не будет собран.

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

...