在运行时轮询 C# 应用程序的内存使用情况?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

我认为 Process.PrivateMemorySize64() 是用于活动内存使用的正确方法。 我不确定Process.PagedMemorySize64 何时有用,但在我的情况下它并没有真正起作用。我在实例化一堆对象并运行解析器之前/之后进行比较,并且 PagedMemorySize64 在之前和之后报告了相同的值,而 GC.GetTotalMemory(true) 似乎更有效地报告了内存使用的变化。 ***.com/questions/750574/… @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();

【讨论】:

以上是关于在运行时轮询 C# 应用程序的内存使用情况?的主要内容,如果未能解决你的问题,请参考以下文章

通过Linux定时任务实现定时轮询数据库及发送Http请求

对于 Alsa pcm 设备,period_size 设置为 128,但有时轮询发生较晚

Linux日志管理神器之Logrotate日志分割,以及crontab定时轮询

在 C# 应用程序运行时分析所有变量的内存使用情况

Linux 日志定时轮询流程详解

谁能提供一个 angularjs 设置的示例,该设置在收到数据时轮询数据并更新 UI?