有什么方法可以减少.NET应用程序的内存使用?考虑以下简单的C#程序。
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
以 x64 模式编译并在 Visual Studio 之外运行,任务管理器显示如下:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
如果仅为x86编译,效果会稍微好一些:
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
我接着尝试了下面这个程序,它和之前的程序相同,但是在运行时初始化后尝试缩小进程大小:
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);
}
在 Visual Studio 之外的 x86 Release 环境下的结果:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
这样已经好了一些,但是对于一个这么简单的程序来说,它仍然显得过于臃肿了。有没有什么技巧可以让C#进程变得更加精简?我正在编写一个主要在后台运行的程序。我已经将任何用户界面相关的操作都放在了一个单独的应用程序域中,这意味着用户界面相关的内容可以被安全卸载,但当它只是静态地驻留在后台时占用10MB内存似乎过多。
P.S. 至于为什么我会关心这个问题——(高级)用户倾向于担心这些事情。即使它几乎没有影响性能,半技术人员(我的目标受众)也往往会对后台应用程序的内存使用量感到恼火。甚至当我看到Adobe Updater占用11MB内存时,我也会感到惊慌,而当看到Foobar2000仅占用不到6MB内存甚至在播放时都极少消耗内存时,我会感到安心。我知道在现代操作系统中,这些东西在技术上并不那么重要,但这并不意味着它不会影响感知。