【问题标题】:Poll C# app's memory usage at runtime?在运行时轮询 C# 应用程序的内存使用情况?
【发布时间】:2010-10-02 14:12:22
【问题描述】:

我有一个应用程序在运行时需要轮询自己的内存使用情况。如果它可以列出每个实例化对象的内存使用情况,那将是理想的。我知道这可以通过 WMI 实现,但我希望有一些不依赖于 WMI 的东西。

【问题讨论】:

    标签: c# runtime memory-management


    【解决方案1】:

    您可能会觉得有用的两个函数是:

      GC.GetTotalMemory();
      Process.PagedMemorySize64();
    

    我的经验是 GC.GetTotalMemory() 不是非常可靠。它通常报告的内存使用量远小于实际内存使用量。我看到它报告说,当我的程序在 16 GB 的机器上耗尽内存时,我只使用了 8 GB。

    我还没有测试过 Process.PagedMemorySize64,虽然它看起来很有希望。

    【讨论】:

    • 我认为 Process.PrivateMemorySize64() 是用于活动内存使用的正确方法。
    • 我不确定Process.PagedMemorySize64 何时有用,但在我的情况下它并没有真正起作用。我在实例化一堆对象并运行解析器之前/之后进行比较,并且 PagedMemorySize64 在之前和之后报告了相同的值,而 GC.GetTotalMemory(true) 似乎更有效地报告了内存使用的变化。
    • @SteveWortham 各种进程属性(例如,PagedMemorySize64)被缓存,所以简单地再次访问它们不会给你新的值。 Process.Refresh() 旨在吹走缓存并获取新数字,但我发现它不起作用。但是,实际上每次都创建一个新的 Process 对象(System.Diagnostics.Process.GetCurrentProcess())就可以了。不理想,但确实有效。
    • 我同意史蒂夫的观点(尽管答案中提到了潜在的缺陷) GC.GetTotalMemory(true) 似乎是要走的路。当我在一个方法内本地分配内存并从该方法返回时,该内存基本上已被释放以供重用,但只有 GC.GetTotalMemory(true) 识别这一点。
    【解决方案2】:
    Process proc = Process.GetCurrentProcess();
    Logger.Info(proc.PeakWorkingSet64/1024 + "kb");
    

    【讨论】:

      【解决方案3】:

      您可以监听 perfmon 计数器,这将为您提供大量数据(GC 活动/物理内存使用/托管堆等)

      如果您需要更深入,您可能必须为自己附加一个调试器,这确实非常棘手,因为您必须生成一个新进程并与之通信,并遍历您的内存。

      【讨论】:

        【解决方案4】:

        您可以从 Process 类 System.Diagnostics 获得有关您的流程的一些粗略粒度。 http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx.

        没有“每个对象”的东西,但至少可以收集有关您的进程的一些内存信息。

        【讨论】:

          【解决方案5】:

          也许

          Windows::System::Diagnostics::ProcessDiagnosticInfo::GetForCurrentProcess();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-20
            • 1970-01-01
            • 2012-11-12
            • 1970-01-01
            • 2013-05-11
            • 1970-01-01
            • 2021-08-26
            • 2015-05-25
            相关资源
            最近更新 更多