.Net: Вложенные ссылки - PullRequest
0 голосов
/ 31 марта 2009

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

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

Public Class SomeClass
    Private m_SomeOtherClass(Me)
End Class

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

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

Ответы [ 3 ]

4 голосов
/ 31 марта 2009

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

1 голос
/ 31 марта 2009

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

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

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

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

1 голос
/ 31 марта 2009

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

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