【问题标题】:How to measure the total memory consumption of the current process programmatically in .NET?如何在 .NET 中以编程方式测量当前进程的总内存消耗?
【发布时间】:2011-01-21 11:18:45
【问题描述】:

如何在.NET中以编程方式测量当前进程的总内存消耗?

【问题讨论】:

    标签: c# .net performance memory memory-management


    【解决方案1】:

    【讨论】:

    • 我觉得这个计数器令人困惑。示例:“# Total reserved Bytes”:“显示虚拟内存量。以字节为单位,当前由垃圾收集器保留。”然后我想知道?这是关于进程内存还是关于即将收集的内存?
    • new PerformanceCounter("Process", "Private Bytes", "ConsoleApplication1.vshost").RawValue 看起来很有希望
    【解决方案2】:

    参考这个SO question

    再试试这个

    Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
    long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;
    

    【讨论】:

    • 据此博客blogs.msdn.com/salvapatuel/archive/2007/10/13/…Working set != 总进程内存
    • 但在我的测试中,WorkingSet64 的值非常非常接近 TaskManager 显示的值
    • @Jader Dias - 这个答案抓住了所需的本质(使用 System.Diagnostics.Process 类型),但要警惕垃圾收集器可能会或可能不会做的事情,否则你可能会结束得到高度误导的结果 - 我在回答中展示了如何避免这个问题
    【解决方案3】:

    如果您只想测量由某些不同操作引起的虚拟内存使用量的增加,您可以使用以下模式:-

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    
    var before = System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64;
    
    // performs operations here
    
    var after = System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64;
    

    当然,这是假设您的应用程序在上述操作运行时未在其他线程上执行操作。

    您可以将VirtualMemorySize64 替换为您感兴趣的任何其他指标。查看System.Diagnostics.Process 类型以了解可用的指标。​​

    【讨论】:

    • 为什么要调用 GC.Collect 两次?
    • 第一次,对象被放在 freachable 队列中,然后被最终确定。之后,它们就可以收藏了。
    【解决方案4】:

    我发现这非常有用:

    Thread.MemoryBarrier();
    var initialMemory = System.GC.GetTotalMemory(true);
    // body
    var somethingThatConsumesMemory = Enumerable.Range(0, 100000)
        .ToArray();
    // end
    Thread.MemoryBarrier();
    var finalMemory = System.GC.GetTotalMemory(true);
    var consumption = finalMemory - initialMemory;
    

    【讨论】:

    • 叹息...只是让阅读此内容的任何人都不会感到困惑...您只为一个线程提供了代码,因此 MemoryBarrier 调用毫无用处(并且没有多线程版本的那些也有任何意义)。我不确定你认为这些是做什么的,但这不是他们实际做的。
    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多