Утечки памяти в С# 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, поэтому публикация корневого пути, который вы видите, должна помочь определить конечную причину. В общем, однако, попытайтесь понять, почему эти объекты хранятся на вашем объекте, и посмотрите, есть ли способ отсоединить обработчики событий, привязки и т.д., Когда окно закрыто.
Недавно я опубликовал запись блога о некотором утечке памяти, который может быть вызван определенными привязками; для этих конкретных типов утечек код полезен для поиска привязки, которая виновата.