У меня есть объект, которому я верю, сохранен только WeakReference. Я проследил его ссылочных держателей, использующих SOS и SOSEX, и оба подтверждают, что дело обстоит так (я не эксперт SOS, таким образом, я мог быть неправым по этому вопросу).
Стандартное объяснение WeakReferences состоит в том, что GC игнорирует их при выполнении его разверток. Тем не менее, мой объект переживает вызов к GC.Collect (GC.MaxGeneration, GCCollectionMode. Вызванный).
Действительно ли это возможно для объекта, на который только ссылаются с WeakReference для выживания того набора? Существует ли еще более полный набор, который я могу вызвать? Или, я должен пересмотреть свою веру, что единственные ссылки на объект слабы?
Обновление и заключение
Первопричина состояла в том, что была ссылка на стеке, который блокировал объект. Неясно, почему ни SOS, ни SOSEX не показывали ту ссылку. Пользовательская ошибка всегда является возможностью.
В ходе диагностирования первопричины я действительно делал несколько экспериментов, которые продемонстрировали, что WeakReferences к объектам второго поколения может слоняться поблизости удивительно долгое время. Однако 2-й объект генерала WRd не переживет GC.Collect (GC.MaxGeneration, GCCollectionMode. Вызванный).
Согласно википедии «Объект, на который ссылаются только слабые ссылки, считается недостижимым (или« слабо достижимым ») и поэтому может быть собран в любое время. Слабые ссылки используются, чтобы избежать сохранения памяти, на которую ссылаются ненужные объекты»
I Я не уверен, что ваш случай касается слабых ссылок ...
Попробуйте вызвать GC.WaitForPendingFinalizers ()
сразу после GC.Collect ()
.
Другой возможный вариант: никогда не используйте WeakReference
ни для каких целей. В дикой природе я когда-либо видел, что они используются только в качестве механизма для уменьшения объема памяти приложения (то есть формы кеширования). Как говорит могущественный MSDN :
Избегайте использования слабых ссылок в качестве автоматического решения проблем управления памятью . Вместо этого разработайте эффективную политику кэширования для обработки объектов вашего приложения.