有哪些提示可以减少.NET应用程序的内存使用量?考虑以下简单的C#程序.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
在x64的发布模式下编译并在Visual Studio外部运行,任务管理器报告以下内容:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
Run Code Online (Sandbox Code Playgroud)
如果它只为x86编译它会好一点:
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Run Code Online (Sandbox Code Playgroud)
然后,我尝试了以下程序,它执行相同但尝试在运行时初始化后修剪进程大小:
class Program
{
static void Main(string[] args)
{
minimizeMemory();
Console.ReadLine();
}
private static void minimizeMemory()
{
GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,
(UIntPtr) 0xFFFFFFFF, (UIntPtr)0xFFFFFFFF);
}
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetProcessWorkingSetSize(IntPtr process,
UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize);
}
Run Code Online (Sandbox Code Playgroud)
在Visual Studio外部的 …
来自java背景,我习惯的事情之一就是告诉JVM最大堆大小应该是多少.如果正在运行的程序试图吞下超过允许的数量,并且垃圾收集器无法释放任何更多的资源,那么抛出OutOfMemoryError就会发生爆炸.因此,在Java中设置最大堆大小非常重要.
这适用于.net吗? 你能设置堆大小限制吗?CLR是否只是在它达到机器的物理极限之前不断增长?或者,由于我的Java眼罩阻止我看到某些微妙的原因,它在.net中不是问题吗?
我可以配置C#应用程序将其内存消耗限制为200MB吗?IOW,我不想等待自动GC(这似乎使堆的增长超出了此应用程序的实际需求)。
我知道在Java中有一个命令行开关,您可以将其传递给实现此目标的JVM。.在C#中是否等效?
ps
我知道我可以从代码中调用GC,但这是我宁愿不必定期执行的操作。我宁愿以某种方式在启动时设置它,然后忘记它。