Утечка памяти в WPF, но только когда общий объем документа превышает пороговое значение - PullRequest
1 голос
/ 02 марта 2010

Проблема утечки памяти в WPF. Память стабильна с небольшими документами, но увеличивается до исключения OOM с большими документами.

Справочная информация:

Мы разработали приложение WPF для управления динамическим дисплеем. Существует компонент «Дизайн», в котором пользователь размещает отображаемый документ, и компонент «Отображение документа».

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

Проблема:

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

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

Кто-нибудь еще видел подобное поведение? Есть идеи для решения? Я предполагаю, что проблема связана с фрагментацией Large Object Heap, но это только предположение.

К сожалению, у меня нет примера кода для публикации, так как это часть более крупного решения. Я попытаюсь создать пример приложения, иллюстрирующего это поведение, и обновлю свой пост.

1 Ответ

0 голосов
/ 02 марта 2010

Чтобы правильно диагностировать это, вы могли бы начать с минидампа в точке сбоя или непосредственно перед ней, а также использовать подходящий отладчик (для меня WinDbg с SOS), чтобы понять, что происходит. В Win7 (не в XP, не уверен в Vista) вы можете создать мини-дамп, щелкнув правой кнопкой мыши приложение / процесс в диспетчере задач и выбрав соответствующую опцию.

Если это не куча больших объектов, это может быть связано с GC. Предположительно, с каждым добавляемым элементом связана дополнительная нагрузка на классы - создается ли много переходных классов (скажем, при каждом рендеринге отображения)? Возможно, из-за нехватки памяти GC перемещает множество объектов в Gen1 и / или Gen2, и это увеличивает нагрузку на память.

Команда SOS / WinDbg "! Eeheap -gc" напечатает размер ваших поколений GC, что может показать, что Gen2 заполняется при увеличении данных вашего приложения.

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