Использование памяти WPF № 2 - PullRequest
2 голосов
/ 12 мая 2009

Я задал вопрос о моей проблеме с управлением памятью в WPF, но это другой вопрос о той же проблеме. Я использую DotTrace, пытаясь выяснить, что происходит. Когда я запускаю свое приложение, я вижу в диспетчере задач, что оно занимает 200 МБ. DotTrace сообщает в общей сложности 33 МБ. Если я просто сверну окно и восстановлю его, объем памяти в соответствии с ТМ составит около 25 МБ.

У меня есть ListBox, который показывает имена людей и картинки. Он показывает до 3000 человек (я буду работать над пейджингом, но здесь дело не в этом). Прокручивая вниз, я вижу в TM, что память быстро увеличивается. Если я продолжу прокручивать память вверх и вниз, то быстро получу 1 ГБ. Во время прокрутки нет никаких изменений в базовых данных и нет моих собственных событий. Если я сверну окно и восстановлю его, объем памяти уменьшится с 1 ГБ до 25 МБ.

Перед тем, как свернуть и увидеть, как уменьшается память в TM, я сделал снимок с помощью DotTrace, и он показывает тот же объем памяти, что и до прокрутки - около 30 МБ или около того.

Может кто-нибудь объяснить мне, что происходит с памятью, когда приложение свернуто? Нужно ли доверять фигуре, показанной в диспетчере задач?

Спасибо

PS1: Нет никаких изменений в поведении, если я добавлю или не добавлю это в свой список:

VirtualizingStackPanel.IsVirtualizing="True" 
VirtualizingStackPanel.VirtualizationMode="Recycling"

PS2: Я поместил кнопку с кодом, и GC мало что восстанавливает (она падает, скажем, с 700 МБ до 680 МБ):

    GC.Collect();
    GC.WaitForPendingFinalizers();

Ответы [ 2 ]

2 голосов
/ 12 мая 2009

Не могу дать вам однозначный ответ, но на некоторые вещи нужно указать:

  1. DotTrace показывает только использование управляемой памяти. Похоже, ваше приложение использует большие объемы неуправляемой памяти (возможно, выделенной самим WPF для всех этих образов).

  2. Минимизация процесса обычно не освобождает память, она просто выгружает ее для использования другими приложениями. В данном случае это красная сельдь.

  3. Посмотрите, как работает сборка мусора в .Net.

  4. Пока ваш процесс не достигнет ограничений ресурсов, установленных ОС, он не обязательно освободит память, выделенную ему.

  5. Используйте встроенные в Windows счетчики производительности. Они покажут вам более полезную общую разбивку памяти вашего приложения, чем DotTrace, включая управляемую и неуправляемую память.

  6. DotTrace отстой. Получить муравьи или что-то. Я люблю ReSharper, но Jetbrains действительно не должны брать плату за DotTrace, это печально.

Редактировать: 4) немного вводит в заблуждение - менеджер памяти .Net может освободить память по другим причинам (когда поколение заполнено, для начинающих).

0 голосов
/ 12 мая 2009

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

EDIT:

После просмотра ваших правок вы можете попробовать установить IsVirtualizing на false для тестирования. Значением по умолчанию является true, поэтому его пропуск ничего не изменит.

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