【发布时间】:2010-10-02 14:12:22
【问题描述】:
我有一个应用程序在运行时需要轮询自己的内存使用情况。如果它可以列出每个实例化对象的内存使用情况,那将是理想的。我知道这可以通过 WMI 实现,但我希望有一些不依赖于 WMI 的东西。
【问题讨论】:
标签: c# runtime memory-management
我有一个应用程序在运行时需要轮询自己的内存使用情况。如果它可以列出每个实例化对象的内存使用情况,那将是理想的。我知道这可以通过 WMI 实现,但我希望有一些不依赖于 WMI 的东西。
【问题讨论】:
标签: c# runtime memory-management
您可能会觉得有用的两个函数是:
GC.GetTotalMemory();
Process.PagedMemorySize64();
我的经验是 GC.GetTotalMemory() 不是非常可靠。它通常报告的内存使用量远小于实际内存使用量。我看到它报告说,当我的程序在 16 GB 的机器上耗尽内存时,我只使用了 8 GB。
我还没有测试过 Process.PagedMemorySize64,虽然它看起来很有希望。
【讨论】:
Process.PagedMemorySize64 何时有用,但在我的情况下它并没有真正起作用。我在实例化一堆对象并运行解析器之前/之后进行比较,并且 PagedMemorySize64 在之前和之后报告了相同的值,而 GC.GetTotalMemory(true) 似乎更有效地报告了内存使用的变化。
Process proc = Process.GetCurrentProcess();
Logger.Info(proc.PeakWorkingSet64/1024 + "kb");
【讨论】:
您可以监听 perfmon 计数器,这将为您提供大量数据(GC 活动/物理内存使用/托管堆等)
如果您需要更深入,您可能必须为自己附加一个调试器,这确实非常棘手,因为您必须生成一个新进程并与之通信,并遍历您的内存。
【讨论】:
您可以从 Process 类 System.Diagnostics 获得有关您的流程的一些粗略粒度。 http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx.
没有“每个对象”的东西,但至少可以收集有关您的进程的一些内存信息。
【讨论】:
也许
Windows::System::Diagnostics::ProcessDiagnosticInfo::GetForCurrentProcess();
【讨论】: