Утечка памяти в приложении WPF - PullRequest
2 голосов
/ 10 сентября 2009

После определенного действия (нажатие кнопки, запускающей последовательность вычислений) в приложении WPF происходит утечка памяти (это видно в диспетчере задач в разделе размера vm) примерно через 10 мегабайт после каждое нажатие кнопки.

Последовательность расчетов не содержит ошибок.

Использование профилировщика памяти (.NET Memory Profiler) показало, что утечки в .net отсутствуют, но после каждого нажатия кнопки размер памяти, показанный в разделе «Имя / Ресурс» (помеченный как HeapMemory), увеличивается примерно на 10 мегабайт.

Я читал посты о утечках в WPF, но это определенно не мой случай.

Что может быть не так? Какие-либо предложения? Может быть, у кого-то была такая же проблема?

Ответы [ 3 ]

3 голосов
/ 11 сентября 2009

Наблюдение за увеличением используемой памяти является ошибочным в .NET для обнаружения утечки памяти.

Это легко сделать утечку памяти в WPF, однако. Я бы предложил использовать немного более визуальный инструмент, такой как Redgate Ants Memory Profiler (14-дневная бесплатная пробная версия). Используйте этот метод для проверки на утечки:

  1. Нажмите кнопку один раз (чтобы съесть любой разогрев, который у вас может быть)
  2. Сделайте снимок
  3. Нажмите кнопку еще раз
  4. Сделайте снимок

Когда вы заходите в «Список классов» и проверяете фильтр на «Из текущего снимка: только новый объект». Это должно дать вам лучшее представление о том, есть ли у вас объекты, которые никогда не отпустят.

Еще одна особенность Ants Memory Profiler заключается в том, что он везде содержит ссылки на видео, которые объясняют, как найти утечку. Отслеживание утечек - это черное искусство, и приятно иметь помощь.

Нет, я не работаю на Redgate:)

2 голосов
/ 10 сентября 2009

Возможно, вам нужно использовать шаблон WeakEvent, как описано в MSDN , чтобы избежать утечек?

Прослушивание событий может привести к утечкам памяти. Типичная техника для прослушивания события заключается в использовании специфичного для языка синтаксиса, который присоединяет обработчик к событию в источнике. Например, в C # этот синтаксис: source.SomeEvent += new SomeEventHandler(MyEventHandler).

Этот метод создает сильную ссылку от источника события к слушателю события. Обычно присоединение обработчика события для слушателя приводит к тому, что у слушателя будет время жизни объекта, на которое влияет время жизни объекта для источника (если обработчик события явно не удален). Но в определенных обстоятельствах вы можете захотеть, чтобы время жизни объекта слушателя контролировалось только другими факторами, такими как то, принадлежит ли он в настоящее время к визуальному дереву приложения, а не временем жизни источника. Всякий раз, когда время жизни исходного объекта выходит за пределы срока жизни объекта слушателя, нормальный шаблон событий приводит к утечке памяти: слушатель остается живым дольше, чем предполагалось.

(мой акцент.)

0 голосов
/ 12 октября 2012

Я мог бы решить проблему утечки памяти в приложении WPF, вставив в «тонкие» места GC.Collect () .

Надеюсь, эта помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...