Как GC справляется с этой проблемой на платформе .net? - PullRequest
0 голосов
/ 09 июня 2011

У меня есть этот код

 classObject var1 = new classObject();
 classObject var2 = var1;

Теперь я написал это:

 var1 = null;

Как GC справится с этим? Будет ли GC собирать экземпляр этого classObject?

А как GC повесит это, если я напишу var2 = null? (и удалите var1 = null из кода)

Ответы [ 5 ]

8 голосов
/ 09 июня 2011

Краткий ответ: нет, потому что var2 по-прежнему ссылается на экземпляр. Пока у вас есть хотя бы одна ссылка на объект, объект не будет собран.

Более длинный ответ: на самом деле, вероятно, так и будет в этом примере, потому что вы ничего не делаете с var2. GC учитывает переменную жизнеспособность. Если вы никогда больше не используете var2 в коде, var2 считается неработоспособным после этой последней строки кода. И поэтому считается, что такая ссылка не имеет смысла для целей сборки мусора - как будто var2 больше не существует. Таким образом, на самом деле объект будет иметь право на коллекцию:

Дополнительные тонкости: это также будет зависеть от того, работаете ли вы в режиме отладки или выпуска. При отладке .NET искусственно продлевает жизнеспособность переменных, расширяя их до конца их лексической области действия, так что у вас есть возможность проверять локальные переменные. Кроме того, конечно, объекты будут собираться только тогда, когда GC действительно работает.

Строго говоря, на самом деле невозможно дать универсально правильный ответ.

4 голосов
/ 09 июня 2011

У вас еще есть ссылка на объект (var2).

Все зависит от контекста.

GC может собирать объекты, даже если у вас все еще есть ссылки на объект (если он определяет, что этот объект больше не будет использоваться в вашем коде)

Интересно читать: http://www.theserverside.net/tt/articles/showarticle.tss?id=GarbageCollection

Обновление

Мне кажется, что вы путаете типы значений со ссылочными типами. Когда вы присваиваете переменную, вы назначаете не фактический объект, а ссылку. И GC (в большинстве случаев) не будет собирать объекты, если переменная где-то будет иметь ссылку на нее.

Вот статья, показывающая разницу: http://www.albahari.com/valuevsreftypes.aspx

4 голосов
/ 09 июня 2011

Нет, потому что у вас все еще есть живая ссылка на объект в var2. Если вы обнулите оба значения var1 и var2, он станет приемлемым для сбора (при условии, что больше нет ссылок).

2 голосов
/ 09 июня 2011

Вы устанавливаете только указатель var1 на null var2, который все еще указывает на classObject, поэтому GC не будет собирать classObject, пока не будет найдена хотя бы одна ссылка на classObject живой

1 голос
/ 09 июня 2011

Сборка мусора работает, просматривая стек, чтобы определить, есть ли у объектов в куче живые ссылки. Если объект в куче не указан в стеке, он может быть использован для сборки мусора.

Вы можете переназначать ссылки сколько угодно раз, пока объект доступен из стека, он не будет собирать мусор!

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