Утечки памяти в C# WPF

Я мог бы воспользоваться некоторыми советами по отслеживанию причин утечек памяти в С#. Я понимаю, что такое утечка памяти, и понимаю, почему они возникают в C#, но мне интересно, какие инструменты/стратегии вы использовали в прошлом для их устранения?

Я использую .NET Memory Profiler и обнаружил, что один из моих огромных основных объектов остается в памяти после закрытия окна, которым он управляет, но я не уверен, что делать, чтобы удалить все ссылки на него.

Если я недостаточно ясен, просто опубликуйте ответ с вопросом, и я отредактирую свой вопрос в ответ. Спасибо!


person Justin Bozonier    schedule 22.10.2008    source источник
comment
также попробуйте Ants Memory Profiler, так как он покажет объекты ведьмы, указывающие на данный объект   -  person Ian Ringrose    schedule 24.09.2009


Ответы (2)


Войдите в отладчик, а затем введите это в окно Immediate:

.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll

Пути к sos.dll различаются. Чтобы узнать правильный путь, нужно найти mscorwks.dll на панели «Модули». Откуда бы это ни загружалось, это правильный путь для sos.dll.

Затем введите это:

System.GC.Collect()

Это гарантирует, что все, что недоступно, будет собрано. Затем введите это:

!DumpHeap -type <some-type-name>

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

!gcroot <some-address>
person Daniel Earwicker    schedule 22.10.2008
comment
Мне пришлось использовать System.GC.Collect(), чтобы заставить сборку мусора работать. - person nash; 17.08.2011
comment
Я думаю, это может зависеть от того, где остановился отладчик, когда вы его взломали. Я исправлю свой ответ, чтобы он работал независимо. - person Daniel Earwicker; 18.08.2011

.NET Memory Profiler — отличный инструмент, который я часто использую для диагностики утечек памяти в приложениях WPF.

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

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

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

person Bradley Grainger    schedule 23.10.2008