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

#c# #.net #wpf #mvvm #memory-leaks

#c# #.net #wpf #mvvm #утечки памяти

Вопрос:

Я разрабатываю приложение WPF MVVM (в версии v3.5), используя GalaSoft.MVVMLight suite и WPF Toolkit для DataGrid и DatePicker . Однако я сталкиваюсь с множеством утечек памяти в приложении каждый раз, когда я загружаю UserControl в MainWindow . Я пытаюсь выяснить точную проблему с помощью профилировщика памяти Scitech, хотя у меня есть несколько серьезных вопросов :

  1. Как отсоединить / unbind RelayCommand от Event в виртуальной машине?
  2. mscorlib и PresentationFramework также потребляют много памяти, и большинство из них являются strings . Я не знаю, откуда они берутся.

Пожалуйста, помогите.

Ответ №1:

Взгляните на эти статьи, чтобы узнать причины утечек памяти в WPF, их решения и как их найти —

Поиск утечек памяти в приложениях на основе WPF:

http://blogs.msdn.com/b/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx

Утечки памяти в приложениях WPF:

http://svetoslavsavov.blogspot.com/2010/05/memory-leaks-in-wpf-applications.html

Поиск управляемых утечек памяти в приложениях WPF и Silverlight:

http://blogs.msdn.com/b/wpftesting/archive/2009/03/21/finding-managed-memory-leaks-in-wpf-and-silverlight-applications.aspx

В случае, если вы используете WPF 3.5 SP1, взгляните на эти исправления —

Исправления утечки памяти для WPF 3.5 SP1

http://blogs.msdn.com/b/jgoldb/archive/2010/06/14/memory-leak-hotfixes-for-wpf-3-5-sp1.aspx

Некоторые более редкие сценарии, вызывающие утечки памяти —

http://blog.ramondeklein.nl/?p=58

http://code .logos.com/blog/2008/10/detecting_bindings_that_should_be_onetime.html

Ответ №2:

Вы уверены, что это утечки памяти? правильно ли вы используете профилировщик? Чтобы подтвердить, что у вас есть утечки памяти, вы должны запустить сборщик мусора, чтобы все объекты, на которые не ссылается stackframe, были удалены. После запуска сборщика мусора проверьте кучу памяти на наличие объектов, которые должны были быть собраны.

Например. в вашем приложении откройте представление или документ, закройте его, сборщик мусора, а затем проверьте, было ли оно удалено.