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

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

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

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

Ответы

Ответ 1

Перейдите в отладчик и введите его в окно "Немедленное":

.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>

Ответ 2

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

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

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

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