【问题标题】:.NET EXE memory footprint.NET EXE 内存占用
【发布时间】:2010-09-18 09:45:51
【问题描述】:

即使是 C# 中的简单 Notepad 应用程序也会消耗数兆字节的 RAM,如任务管理器中所示。在最小化应用程序时,任务管理器中的内存大小会显着下降,并在应用程序最大化时备份。

我在某处读到 .NET 进程提前为运行时分配预留了大量内存。这就是为什么 .NET 应用程序一开始就有更大的内存占用。但是可以使用 Win32 API 调用来释放此内存。权衡是运行时分配变慢 - 是这样吗?

【问题讨论】:

    标签: .net


    【解决方案1】:

    内存占用大的原因是 JIT 编译器和Windows Forms 引擎正在与您的进程一起加载。为了减少这种情况,您可以执行以下操作:

    [DllImport("psapi.dll")]
    static extern int EmptyWorkingSet(IntPtr hwProc);
    
    static void MinimizeFootprint()
    {
        EmptyWorkingSet(Process.GetCurrentProcess().Handle);
    }
    

    这应该尽可能多地从您的内存占用中删除。可能还有一种方法可以减少为运行时内存分配预留的内存量。

    【讨论】:

    • 我想对此表示感谢...我知道工作集不是有效的表示,但这个数字往往会吓到管理员。这个技巧只是将我正在开发的一个应用程序从平均 80 - 120 兆工作集降低到 20 - 40。+1
    • dotnetcoder -- 权衡的是,如果您的应用程序需要您释放的任何资源,您将招致性能损失,这是相对可能的。
    • 约翰·鲁迪——我知道那是怎么回事;有人看到您的应用程序占用了“大量空间”和怪胎。我很高兴这对您有所帮助。 :)
    • 我说:让windows处理工作集的大小。强制它将所有内容写入页面文件对性能不利。同样的原因你不应该强制垃圾收集。教育那些根据工作集大小认为您的应用占用大量内存的人。
    • 好主意,教育全世界,尤其是软件审阅者。这是一个实用的解决方案。或者也许不是。似乎最好接受(可能难以察觉的)性能打击。
    【解决方案2】:

    TaskManager 不应用于测量 .NET 应用程序的内存占用量。

    当 .NET 应用程序启动时,它会向操作系统请求一块内存,然后将其分段为托管堆、堆栈和大型对象堆。 TaskManager 报告的正是这个总内存块,它可能被 .NET 完全使用,也可能不被完全使用。一旦 .NET 应用程序获得了一块内存,它不会在操作系统要求之前释放它,这只会在操作系统确定需要更多内存资源时发生。

    如果要测量内存分配,则需要查看各种性能监视器 (PerfMon) 计数器。

    您可以使用互操作代码调用 Win32 API 来调整您的工作集大小,但是当您的应用程序下次从操作系统请求内存时,工作集将重新启动,并且在操作系统分配和处理时会影响性能取出额外的内存,.NET 运行时“配置”它。

    【讨论】:

      【解决方案3】:

      任务管理器不显示 .NET 应用程序的实际内存使用情况。要查看您几乎必须在应用程序上放置一个性能计数器或使用分析器。

      您在任务管理器中看到的是应用程序的工作内存,其中包括框架本身的大量开销,这些开销也必须在您的应用程序加载时加载。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多