У меня есть приложение Silverlight 4, в котором есть класс ViewModel с утечкой. Я подтвердил это с помощью WinDbg и команды! Gcroot для моего типа ViewModel. Мне не удалось точно определить точную причину утечки памяти, но я попытался устранить ее, используя следующую строку кода в соответствующем представлении, когда она закрыта:
HtmlPage.Window.Navigate(new Uri(MyTopLevelUri));
Это заставляет приложение перезагружаться, и, следовательно, RootVisual повторно инициализируется. Теперь, когда я использую WinDbg, я вижу, что больше нет ссылок, удерживающих класс ViewModel после закрытия View.
Однако, когда я отслеживаю использование памяти приложением (используя SysInternals), оно постоянно увеличивается. Иногда он может немного падать, но если я продолжу открывать и закрывать подозрительное представление, я в конечном итоге получаю частный набор байтов памяти размером более 1 000 000 КБ. Кроме того, даже если я добавлю код для принудительной установки GC, он никогда не восстановит всю выделенную память. Должен ли я волноваться?
Есть ли утечки памяти, присущие SL4 и элементам управления? Я не очень верю, учитывая недавно выпущенный патч для исправления утечек памяти с помощью DataTemplates (версия 4.0.60129.0 http://timheuer.com/blog/).