有什么技巧可以减少.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 上的结果:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
这样做更好一些,但是对于这样一个简单的程序来说似乎仍然过多。有什么技巧可以使C#流程更精简吗?我正在编写一个旨在大多数时候在后台运行的程序。我已经在单独的“ 应用程序域”中进行了任何用户界面操作,这意味着可以安全地卸载用户界面操作,但是仅在后台使用时要占用10 MB的空间。
PS关于我为什么要关心---(高级)用户倾向于担心这些事情。即使对性能几乎没有影响,精通半技术的用户(我的目标受众)也倾向于对后台应用程序的内存使用情况感到不满。甚至当我看到Adobe Updater占用11 MB的内存并因Foobar2000的平稳触摸而感到安慰时,即使我在播放时,它也占用不到6 MB的内存,我都感到非常惊讶。我知道在现代操作系统中,这些东西在技术上确实无关紧要,但这并不意味着它对感知没有影响。