Perfmon计数器检查内存泄漏

问题描述 投票:21回答:2

我想检查服务中的内存泄漏问题。我尝试了以下perfmon计数器集。

  1. 。NET CLR内存\所有堆中的#字节数
  2. 。NET CLR内存\第二代堆大小
  3. 。NET CLR内存\#GC句柄
  4. 。NET CLR内存\固定对象的数量
  5. 。NET CLR内存\#已提交的总字节数
  6. 。NET CLR内存\#总保留字节数
  7. 。NET CLR内存\大对象堆大小

我已参考here中的上述设置

也称为以下集合:

  1. 内存/可用字节
  2. 内存/已提交字节
  3. 处理/专用字节
  4. 进程/页面文件字节数
  5. 处理/处理计数

我已参考here中的上述设置

是否有任何参数/标准或其他最佳方法来识别用于内存泄漏的性能计数器?谁能建议我一组计数器来检查内存泄漏?或以上设置掩盖了内存泄漏?

performance memory-leaks performancecounter perfmon memory-leak-detector
2个回答
30
投票

要使用性能监视器检测内存泄漏,请监视以下计数器:

  1. 内存/可用字节数计数器使您可以查看可用内存的字节总数。该值通常会波动,但是如果您有内存泄漏的应用程序,它将减少时间。
  2. 如果发生内存泄漏,则“ The Memory / Committed Bytes”计数器将稳定增加,因为随着内存减少,已提交的字节数增加。
  3. “进程/专用字节数”计数器显示专门为特定进程保留的字节数。如果是内存泄漏发生时,该值将趋于稳定上升。
  4. “进程/页面文件字节数”计数器显示页面文件的大小。 Windows使用虚拟内存(页面文件)来补充机器的物理内存。随着机器的物理内存开始填满后,内存页面将移至页面文件。这是正常的即使在具有大量内存的计算机上也要使用的页面文件。但如果页面文件的大小稳定增加,则表明发生内存泄漏。
  5. 我也想提到Process / Handle Count计数器。应用程序使用句柄来标识他们必须使用的资源访问。如果发生内存泄漏,应用程序通常会创建其他句柄以标识内存资源。所以上升句柄计数可能表示内存泄漏。但是,并非全部内存泄漏将导致句柄数增加。

Source

以我的经验,这是准确的。

我还将把您引荐给Microsoft员工Tess的Microsoft高级调试博客。谁建议以下计数器。我发现上述内容足以表明存在内存泄漏,但是我相信Tess的说明可以提供对该问题的更深入了解。

Debugging Demos - Memory Review

  • 。NET CLR内存/所有堆中的#个字节
  • 。NET CLR内存/大对象堆大小
  • 。NET CLR内存/第二代堆大小
  • 。NET CLR内存/第1代堆大小
  • 。NET CLR内存/ Gen 0堆大小
  • 处理/专用字节
  • 进程/虚拟字节

4
投票

[有更好的工具可以使内存泄漏测试更容易,例如RedGate ANTS Memory ProfilerJetBrains dotMemory Profiler

但是,如果您想使用效果计数器,this article说明如何使用性能计数器来测试内存泄漏。

请记住,垃圾回收不会在处理某些实例后立即释放内存。它已经过优化,仅在存在内存压力时才触发和释放内存。因此,如果要测试内存泄漏,应在执行计数器读数之前手动执行垃圾收集。

GC.Collect();
GC.WaitForPendingFinalizers();

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.