我的应用正在运行.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);
感谢。
答案 0 :(得分:1)
您需要首先找出导致记忆力增长的原因。 .Net Memory Profiler是一个很好的工具,因为您可以随着时间的推移拍摄快照并将它们相互比较。你将能够看到哪些物体正在“泄漏”,它将为你提供分配&amp;这些对象的根堆栈,以便您可以修复代码以释放引用。
另外,app.config文件中的DisableDoubleMapping在.Net 4中是无用的。它被添加为.Net Framework 3.5中的一个错误的解决方法,该错误导致程序集被加载到内存中两次。您可以在Microsoft's hotfix page for KB981266中了解有关它的更多信息。