有什么技巧可以减少.NET应用程序的内存使用?考虑以下简单的C#程序。class Program{ static void Main(string[] args) { Console.ReadLine(); }}在x64的发布模式下编译并在Visual Studio外部运行,任务管理器报告以下内容:Working Set: 9364kPrivate Working Set: 2500kCommit Size: 17480k如果只为x86编译会更好一些:Working Set: 5888kPrivate Working Set: 1280kCommit 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: 2300kPrivate Working Set: 964kCommit Size: 8408k这样做更好一些,但是对于这样一个简单的程序来说似乎仍然过多。有什么技巧可以使C#流程更精简吗?我正在编写一个旨在大多数时候在后台运行的程序。我已经在单独的“ 应用程序域”中进行了任何用户界面操作,这意味着可以安全地卸载用户界面操作,但是仅在后台使用时要占用10 MB的空间。PS关于我为什么要关心---(高级)用户倾向于担心这些事情。即使对性能几乎没有影响,精通半技术的用户(我的目标受众)也倾向于对后台应用程序的内存使用情况感到不满。甚至当我看到Adobe Updater占用11 MB的内存并因Foobar2000的平稳触摸而感到安慰时,即使我在播放时,它也占用不到6 MB的内存,我也感到非常惊讶。我知道在现代操作系统中,这些东西实际上在技术上并没有多大关系,但这并不意味着它对感知没有影响。
3 回答
凤凰求蛊
TA贡献1825条经验 获得超4个赞
与本地应用程序相比,.NET应用程序将具有更大的占用空间,因为它们都必须在运行时中加载运行时和应用程序。如果您想要真正整洁的东西,.NET可能不是最佳选择。
但是,请记住,如果您的应用程序大部分时间处于睡眠状态,则必要的内存页面将被换出内存,因此在大多数情况下,实际上并不会给系统造成太大的负担。
如果要减小占用空间,则必须考虑内存使用情况。这里有一些想法:
减少对象的数量,并确保不要将任何实例保留的时间都超过所需的时间。
请注意,
List<T>
类似类型的设备在需要时会使容量增加一倍,因为它们可能导致多达50%的浪费。您可以考虑使用值类型而不是引用类型,以在堆栈上强制使用更多内存,但是请记住,默认堆栈空间仅为1 MB。
避免使用超过85000字节的对象,因为它们将进入未压缩的LOH,因此很容易碎片化。
无论如何,这可能不是一个详尽的清单,而只是几个想法。
LEATH
TA贡献1936条经验 获得超6个赞
在这种情况下,您需要考虑的一件事是CLR的内存成本。为每个.Net进程加载CLR,因此会考虑内存因素。对于这样的简单/小型程序,CLR的成本将决定您的内存占用量。
与该基准程序的成本相比,构建一个实际的应用程序并查看其成本将更具启发性。
- 3 回答
- 0 关注
- 670 浏览
添加回答
举报
0/150
提交
取消