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

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

27 голосов
/ 23 октября 2008

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

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

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

Ответы [ 2 ]

39 голосов
/ 23 октября 2008

Вломитесь в отладчик, а затем введите это в окно 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>
8 голосов
/ 23 октября 2008

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

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

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

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

...