一尘不染

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

c#

有什么技巧可以减少.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的内存,我也感到非常惊讶。我知道在现代操作系统中,这些东西实际上在技术上并没有多大关系,但这并不意味着它对感知没有影响。


阅读 218

收藏
2020-05-19

共1个答案

一尘不染

  1. 您可能要检查堆栈溢出问题 .NET EXE内存占用量
  2. MSDN博客文章“ 工作集!=实际内存占用 量”全部是关于使工作集,进程内存以及如何对RAM中的总消耗量进行准确计算的神秘化。

我不会说您应该忽略应用程序的内存占用-显然,更小,更高效的确是可取的。但是,您应该考虑自己的实际需求。

如果您编写的标准Windows
Forms和WPF客户端应用程序注定要在个人PC上运行,并且很可能是用户在其中运行的主要应用程序,那么您可以摆脱对内存分配的不屑一顾。(只要将其全部释放即可。)

但是,这里要解决的是一些说不用担心的人:如果您要编写将在终端服务环境中运行的Windows
Forms应用程序,并且该共享服务器可能会由10、20或更多用户使用,则是,您绝对必须考虑内存使用情况。您将需要保持警惕。解决此问题的最佳方法是采用良好的数据结构设计,并遵循有关分配时间和分配内容的最佳实践。

2020-05-19