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

.net 如何减少应用程序中的虚拟内存(已提交)大小?,.net,.net-4.0,garbage-collection,virtual-memory,.net,.net 4.0,Garbage Collection,Virtual Memory,我的应用程序正在运行.NET 4.0和WinForm 使用了Mdi应用程序和第三方控件 当它运行时,getting仍然会增加虚拟内存(提交的)大小。 我可以减少和释放工作集大小,例如行 GC.Collect(GC.MaxGeneration); GC.WaitForPendingFinalizers(); SetProcessWorkingSetSize(p.Handle, -1, -1); [DllImport("kernel32.dll", EntryPoint = "SetProcess

我的应用程序正在运行.NET 4.0和WinForm

使用了Mdi应用程序和第三方控件

当它运行时,getting仍然会增加虚拟内存(提交的)大小。 我可以减少和释放工作集大小,例如行

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>

谢谢。

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


另一方面,app.config文件中的DisableDoubleMapping在.NET4中是无用的。它是作为.NETFramework3.5中一个导致程序集两次加载到内存中的错误的解决方法添加的。你可以在中阅读更多关于它的信息。

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


另一方面,app.config文件中的DisableDoubleMapping在.NET4中是无用的。它是作为.NETFramework3.5中一个导致程序集两次加载到内存中的错误的解决方法添加的。您可以在中了解更多信息。

没有魔杖,您必须编写更智能的代码。减少工作集的大小是毫无意义的。没有魔杖,你必须编写更智能的代码。减少工作集的大小是没有意义的。
SetProcessWorkingSetSize(p.Handle, -1, -1);