有哪些技巧可以减少 .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# 进程更精简一些吗?我正在编写一个大多数时间都在后台运行的程序。我已经在一个单独的应用程序域中做任何用户界面的东西,这意味着用户界面的东西可以安全地卸载,但是当它只是坐在后台时占用 10 MB 似乎过多。
PS至于我为什么要关心 ---(Power)用户往往会担心这些事情。即使它对性能几乎没有影响,半精通技术的用户(我的目标受众)也倾向于对后台应用程序内存使用大发雷霆。甚至当我看到 Adobe Updater 占用 11 MB 内存并被 Foobar2000 的平静触感所抚慰时,我都感到震惊,即使在播放时也可能占用不到 6 MB。我知道在现代操作系统中,这些东西在技术上真的没有那么重要,但这并不意味着它对感知没有影响。