Как уменьшить использование памяти приложения WPF

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

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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