为了账号安全,请及时绑定邮箱和手机立即绑定

减少.NET应用程序的内存使用量?

减少.NET应用程序的内存使用量?

函数式编程 2019-11-08 14:04:38
有什么技巧可以减少.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,因此很容易碎片化。

无论如何,这可能不是一个详尽的清单,而只是几个想法。


查看完整回答
反对 回复 2019-11-08
?
LEATH

TA贡献1936条经验 获得超6个赞

在这种情况下,您需要考虑的一件事是CLR的内存成本。为每个.Net进程加载CLR,因此会考虑内存因素。对于这样的简单/小型程序,CLR的成本将决定您的内存占用量。

与该基准程序的成本相比,构建一个实际的应用程序并查看其成本将更具启发性。


查看完整回答
反对 回复 2019-11-08
  • 3 回答
  • 0 关注
  • 670 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信