Как уменьшить использование памяти приложением WPF - PullRequest
10 голосов
/ 23 декабря 2008

Я работаю над небольшим приложением для управления закладками, написанным на C #, с использованием WPF. Он просто сидит в системном трее и простаивает 99% времени. Недавно я заглянул в диспетчер задач и обнаружил, что он использует около 25 мегабайт памяти (и около 12 мегабайт до того, как он активируется в первый раз), что, как мне показалось, было довольно много для приложения, которое практически ничего не делает. Это заставило меня задуматься, есть ли какие-либо способы уменьшить использование памяти, например, отключив дополнительные функции WPF.

Я обнаружил один факт, который может привести к чему-то, хотя я не знаю, как это использовать. Потоки в .NET занимают примерно один мег каждый, и оказывается, что мое приложение использует около 6/12 потоков (до и после активации в первый раз). Это составляет половину моего использования памяти, что довольно существенно. Я не создаю новые потоки напрямую, но понятия не имею, как WPF, как и другие части .NET, использует потоки для различных задач, поэтому мне сложно что-либо с этим делать. Используя события для вещей, которые не связаны напрямую с GUI, это, например, порождает новые потоки?

Итак, я думаю, мой вопрос двоякий, как вы можете уменьшить использование памяти приложениями .NET / WPF в целом и как вы можете минимизировать количество порождаемых потоков? Обратите внимание, что я не столько задумываюсь над мелкими деталями, как те, что приведены в в этом ответе , но скорее над тем, как спроектировать для низкого использования памяти во всем приложении.

Ответы [ 4 ]

5 голосов
/ 23 декабря 2008

Если это приложение в системном трее, вы можете внедрить эту часть программы в WinForms (или даже C ++) и запускать приложение WPF только тогда, когда пользователь дважды щелкает ваш значок. Таким образом, вы платите только за память, когда фактически используете ее.

5 голосов
/ 23 декабря 2008

К сожалению, по моему опыту, ~ 25 МБ - это самое низкое из всех, что я видел для небольших приложений WPF, которые я сделал, по крайней мере, для Windows XP. Я думаю, что даже пустые шаблоны WPF приложений занимают ~ 20 МБ. На какой ОС вы работаете?

Windows Vista - лучшая история, и вы, вероятно, ожидаете увидеть ~ 13-15 МБ для пустого шаблона WPF-приложения.

Если ваше приложение использует 6-12 потоков и использует всего ~ 25 МБ, я бы сказал, что у вас все хорошо. : -)

1 голос
/ 23 декабря 2008

Не уверен, поможет ли это, но в MS Visual C ++ размер стека по умолчанию составляет 1 МБ, и его можно установить на любое значение с помощью параметра компилятора. Очевидно, что приложения C # унаследовали этот размер по умолчанию (поэтому каждый поток занимает минимум 1 МБ). Но, кажется, нет никакой возможности установить его, когда я делаю "csc /?"

0 голосов
/ 23 декабря 2008

. В приложениях .NET / Java факт, что CLR / JVM будет выделять больший объем памяти, чем фактически необходимо / используется . Обычно они менее охотно выпускают выделенные для ОС, если ОС не испытывает недостаток физической памяти.

Но это правда, что управление памятью - сложная тема . Проблема в следующем: как вы определяете использование памяти вашим приложением? Всего выделено виртуальной памяти? общий рабочий набор? частный рабочий набор? использовал память в куче? куча выделена? минимальное, пиковое или среднее?

Одна вещь, которую вы можете сделать, это использовать CLR Profiler , чтобы проверить, выделено ли слишком много кучи. Вы можете попытаться оптимизировать его, потратив на это много времени, чтобы предотвратить слишком сильное свечение кучи.

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