#c# #.net #wpf #mvvm #memory-leaks
#c# #.net #wpf #mvvm #утечки памяти
Вопрос:
Я разрабатываю приложение WPF MVVM (в версии v3.5), используя GalaSoft.MVVMLight suite и WPF Toolkit для DataGrid
и DatePicker
. Однако я сталкиваюсь с множеством утечек памяти в приложении каждый раз, когда я загружаю UserControl
в MainWindow
. Я пытаюсь выяснить точную проблему с помощью профилировщика памяти Scitech, хотя у меня есть несколько серьезных вопросов :
- Как отсоединить / unbind
RelayCommand
отEvent
в виртуальной машине? - mscorlib и PresentationFramework также потребляют много памяти, и большинство из них являются
strings
. Я не знаю, откуда они берутся.
Пожалуйста, помогите.
Ответ №1:
Взгляните на эти статьи, чтобы узнать причины утечек памяти в WPF, их решения и как их найти —
Поиск утечек памяти в приложениях на основе WPF:
Утечки памяти в приложениях WPF:
http://svetoslavsavov.blogspot.com/2010/05/memory-leaks-in-wpf-applications.html
Поиск управляемых утечек памяти в приложениях WPF и Silverlight:
В случае, если вы используете 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, были удалены. После запуска сборщика мусора проверьте кучу памяти на наличие объектов, которые должны были быть собраны.
Например. в вашем приложении откройте представление или документ, закройте его, сборщик мусора, а затем проверьте, было ли оно удалено.