Что происходит с WeakReference после GC WeakReference.Target - PullRequest
8 голосов
/ 28 ноября 2009

Что происходит с WeakReference, когда целевой объект, на который ссылается WeakReference.Target, был собран сборщиком мусора? WeakRerence остается в живых и продолжает существовать? Причина, по которой я спрашиваю, заключается в том, что у меня есть список WeakReferences, хранящийся в списке. Во время выполнения новые WeakReferences постоянно добавляются в этот список. Теперь, когда целевой объект умирает, я должен сам очистить оставленную WeakReference? Если так, есть ли хитрый трюк, как я мог это сделать? Могу ли я получить уведомление, когда WeakReference становится заброшенным? Или мне нужно ввести таймер, который часто просматривает этот список, чтобы узнать, можно ли удалить из этого списка экземпляры WeakReference.

Ответы [ 2 ]

12 голосов
/ 29 ноября 2009

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

Не "часто" просматривайте список с единственной целью его очистки! Каждая мертвая заглушка тратит впустую пару слов памяти. Если список не используется часто, вычислительные затраты на его очистку часто неоправданны, и если он используется часто, он будет очищаться, как предложено выше.

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

6 голосов
/ 28 ноября 2009

Поскольку у вас есть сильная ссылка на объект WeakReference, он не получит GC. Это также разработано, потому что предполагалось, что вы все еще можете использовать WeakReference, чтобы узнать, что цель была GC'ed.

Так что да, вам придется идти по таймеру.

Добавлено: Вы также можете взглянуть на Уведомления о сборке мусора .

...