有什么技巧可以减少.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的内存,我也感到非常惊讶。我知道在现代操作系统中,这些东西实际上在技术上并没有多大关系,但这并不意味着它对感知没有影响。
我不会说您应该忽略应用程序的内存占用-显然,更小,更高效的确是可取的。但是,您应该考虑自己的实际需求。
如果您编写的标准Windows Forms和WPF客户端应用程序注定要在个人PC上运行,并且很可能是用户在其中运行的主要应用程序,那么您可以摆脱对内存分配的不屑一顾。(只要将其全部释放即可。)
但是,这里要解决的是一些说不用担心的人:如果您要编写将在终端服务环境中运行的Windows Forms应用程序,并且该共享服务器可能会由10、20或更多用户使用,则是,您绝对必须考虑内存使用情况。您将需要保持警惕。解决此问题的最佳方法是采用良好的数据结构设计,并遵循有关分配时间和分配内容的最佳实践。