Как Сборщик "мусора" решает, когда уничтожить объекты, сохраненные WeakReferences?

У меня есть объект, которому я верю, сохранен только WeakReference. Я проследил его ссылочных держателей, использующих SOS и SOSEX, и оба подтверждают, что дело обстоит так (я не эксперт SOS, таким образом, я мог быть неправым по этому вопросу).

Стандартное объяснение WeakReferences состоит в том, что GC игнорирует их при выполнении его разверток. Тем не менее, мой объект переживает вызов к GC.Collect (GC.MaxGeneration, GCCollectionMode. Вызванный).

Действительно ли это возможно для объекта, на который только ссылаются с WeakReference для выживания того набора? Существует ли еще более полный набор, который я могу вызвать? Или, я должен пересмотреть свою веру, что единственные ссылки на объект слабы?

Обновление и заключение

Первопричина состояла в том, что была ссылка на стеке, который блокировал объект. Неясно, почему ни SOS, ни SOSEX не показывали ту ссылку. Пользовательская ошибка всегда является возможностью.

В ходе диагностирования первопричины я действительно делал несколько экспериментов, которые продемонстрировали, что WeakReferences к объектам второго поколения может слоняться поблизости удивительно долгое время. Однако 2-й объект генерала WRd не переживет GC.Collect (GC.MaxGeneration, GCCollectionMode. Вызванный).

12
задан bmargulies 13 June 2010 в 00:54
поделиться

2 ответа

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

I Я не уверен, что ваш случай касается слабых ссылок ...

0
ответ дан 3 December 2019 в 00:33
поделиться

Попробуйте вызвать GC.WaitForPendingFinalizers () сразу после GC.Collect () .

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

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

0
ответ дан 3 December 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: