2009-03-31 2 views
0

Насколько уместна сборка мусора, когда дело доходит до вложенных ссылок?.Net: Вложенные ссылки

Возьмите этот код, например:

Public Class SomeClass 
    Private m_SomeOtherClass(Me) 
End Class 

Я знаю, что GC работает, смотря на сколько ссылок остаются, и любой объект, без каких-либо ссылок в конечном итоге получение сбрасывали. Итак, в этом случае, где есть ссылка, исходящая из переменной-члена, происходит ли утечка памяти (если вы не реализуете IDisposable и т. Д.)?

Прямо сейчас я предполагаю, что GC достаточно умен для этого, так как он, вероятно, может проверить, есть ли какие-либо ссылки, исходящие от самого объекта, и просто не считать их по отношению к счету ссылок. Но я подумал, что немного раскошу.

ответ

1

Основной ответ: Это не проблема.

Я слышал такой вопрос раньше, и это связано с путаницей с подсчетом ссылок, где круговая ссылка создает проблему.

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

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

+0

Итак, он начинается с набора корней и выходит, и все, на что не ссылаются, идет. И это вообще не подсчет ссылок, я так понимаю? –

+0

Правильно, я немного разберу ответ. –

4

Это абсолютно нормально. GC работает из набора корней (локальные и статические переменные и т. Д.) И находит все ссылки, которые он может использовать. Если ничего другого не ссылается на этот объект взаимной ссылки, он будет иметь право на сбор.

+0

Другими словами, дочерний объект имеет тот же корень, что и родительский, и поэтому он учитывает только самосогласование. –

+0

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

+0

Отлично, спасибо за ответ Jon! –

1

GC достаточно умный. Он будет собирать оба объекта одновременно, если они распределены достаточно близко друг к другу во временных и космических измерениях;)

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