在运行时轮询 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# 应用程序的内存使用情况?的主要内容,如果未能解决你的问题,请参考以下文章
对于 Alsa pcm 设备,period_size 设置为 128,但有时轮询发生较晚