我有一个应用程序在运行时需要轮询自己的内存使用情况。如果能够列出每个实例化对象的内存使用情况,那就更理想了。我知道这可以通过 WMI 实现,但我希望有一种不依赖于 WMI 的方法。
我有一个应用程序在运行时需要轮询自己的内存使用情况。如果能够列出每个实例化对象的内存使用情况,那就更理想了。我知道这可以通过 WMI 实现,但我希望有一种不依赖于 WMI 的方法。
你可能会发现两个有用的函数:
GC.GetTotalMemory();
Process.PagedMemorySize64();
我的经验是GC.GetTotalMemory()并不十分可靠。它经常报告比实际内存使用量小得多的内存使用情况。我曾看到它报告我只使用了8GB内存,而我的程序在16GB机器上耗尽了内存。
虽然我还没有测试过Process.PagedMemorySize64,但它看起来很有前途。
Process proc = Process.GetCurrentProcess();
Logger.Info(proc.PeakWorkingSet64/1024 + "kb");
您可以监听perfmon计数器,这将为您提供大量数据(GC活动/物理内存使用情况/托管堆等)。
如果您需要更深入的了解,可能需要将调试器附加到自己身上,这非常棘手,因为您将不得不生成一个新进程并与其通信,并遍历您的内存。
可能
Windows::System::Diagnostics::ProcessDiagnosticInfo::GetForCurrentProcess();
Process.PagedMemorySize64
有用,但在我的情况下它并没有起作用。我在一些对象被实例化和解析器运行之前/之后进行比较,而PagedMemorySize64在之前和之后都报告相同的值,而GC.GetTotalMemory(true)
似乎更有效地报告了内存使用量的变化。 - Steve Wortham