如何在我的应用程序中减少虚拟内存(已提交)大小?

时间:2011-12-09 04:29:03

标签: .net .net-4.0 garbage-collection virtual-memory

我的应用正在运行.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图像。 程序集和附加引用dll的部分并不是那么大。 当然一些dll(winform的第三个pary控件)大约5~6MB。

如何减少应用中的虚拟内存(提交)大小?

请尽快让我知道。 喜欢这个

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

感谢。

1 个答案:

答案 0 :(得分:1)

您需要首先找出导致记忆力增长的原因。 .Net Memory Profiler是一个很好的工具,因为您可以随着时间的推移拍摄快照并将它们相互比较。你将能够看到哪些物体正在“泄漏”,它将为你提供分配&amp;这些对象的根堆栈,以便您可以修复代码以释放引用。

另外,app.config文件中的DisableDoubleMapping在.Net 4中是无用的。它被添加为.Net Framework 3.5中的一个错误的解决方法,该错误导致程序集被加载到内存中两次。您可以在Microsoft's hotfix page for KB981266中了解有关它的更多信息。