Как я могу уменьшить размер виртуальной памяти (зафиксированной) в моем приложении? - PullRequest
1 голос
/ 09 декабря 2011

Мое приложение работает под управлением .NET 4.0 и WinForm.

Используются Mdi App и сторонние элементы управления.

Когда он запущен, получение все еще увеличивает размер виртуальной памяти (фиксированной). Я мог бы уменьшить и выпустить размер WorkingSet с такими строками

GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
SetProcessWorkingSetSize(p.Handle, -1, -1);

[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);

Работает хорошо. Что ж, для бизнес-логики должно быть открыто несколько экранов, поэтому объем памяти все еще растет, и приложение, наконец, перестает работать.

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

Меня пытались настроить в app.config

<runtime>
<DisableDoubleMapping enabled="true" />
<gcTrimCommitOnLowMemory enabled="true"/>
</runtime>

Это не работает. Любые эффекты на это.

Меня пытались просмотреть с помощью VMMap 3.1. Изображения в основном .net ngen image. Часть сборок и дополнительных ссылок dll не так уж и велика. Конечно, некоторые из dll (третьи парные элементы управления для winform) около 5 ~ 6 МБ.

Как я могу уменьшить размер виртуальной памяти (с подтверждением) в моем приложении?

Пожалуйста, дайте мне знать лучше как можно скорее. Как это

SetProcessWorkingSetSize(p.Handle, -1, -1);

Спасибо.

1 Ответ

1 голос
/ 04 января 2012

Прежде всего вам нужно выяснить, что вызывает рост вашей памяти..Net Memory Profiler - хороший инструмент для этого, так как вы можете делать снимки с течением времени и сравнивать их друг с другом.Вы сможете увидеть, какие объекты «протекают», и это даст вам распределение и корневые стеки для этих объектов, чтобы вы могли исправить свой код, чтобы освободить ссылки.в вашем файле app.config бесполезен в .Net 4. Он был добавлен в качестве обходного пути для ошибки в .Net Framework 3.5, из-за которой сборки дважды загружались в память.Подробнее об этом можно прочитать на странице исправлений Microsoft для KB981266 .

...