Perfmon计数器检查内存泄漏

时间:2012-11-20 13:01:57

标签: performance memory-leaks performancecounter perfmon memory-leak-detector

我想查看服务中的内存泄漏问题。我试过以下一组perfmon计数器。

  1. 所有堆中的.NET CLR内存\#字节
  2. .NET CLR Memory \ Gen 2堆大小
  3. .NET CLR Memory \#GC处理
  4. .NET CLR Memory \ #Pinned Objects
  5. .NET CLR Memory \ #total committed Bytes
  6. .NET CLR Memory \ #total保留字节
  7. .NET CLR内存\大对象堆大小
  8. 我在上面提到了here

    还提到以下集:

    1. 内存/可用字节
    2. 内存/承诺字节
    3. 流程/私人字节
    4. 流程/页面文件字节
    5. 处理/处理计数
    6. 我在上面提到了here

      是否有任何参数/标准或任何其他最佳方法来识别内存泄漏的perfmon计数器? 任何人都可以建议我使用一组计数器来检查内存泄漏吗?或者上面的内容包括内存泄漏?

2 个答案:

答案 0 :(得分:30)

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

  1. Memory / Available Bytes计数器允许您查看可用内存的总字节数。这个值通常会波动,但是如果 你有一个内存泄漏的应用程序,它会减少 时间。
  2. 如果发生内存泄漏,TheMemory / Committed Bytes计数器将稳定上升,因为作为可用字节数 内存减少,提交的字节数增加。
  3. Process / Private Bytes计数器显示专门为特定进程保留的字节数。如果是内存泄漏 发生时,这个值将趋于稳定上升。
  4. 进程/页面文件字节计数器显示页面文件的大小。 Windows使用虚拟内存(页面文件)来补充 机器的物理内存。随着机器的物理内存开始 填满,内存页面被移动到页面文件。这是正常的 即使在具有足够内存的计算机上也要使用的页面文件。但 如果页面文件的大小稳定增加,这是一个好兆头a 内存泄漏正在发生。
  5. 我还想提一下Process / Handle Count计数器。应用程序使用句柄来识别它们必须的资源 访问。如果发生内存泄漏,应用程序通常会 创建其他句柄以标识内存资源。所以上升了 句柄计数可能表示内存泄漏。然而,并非所有 内存泄漏会导致句柄数量增加。
  6. Source

    根据我的经验,这是准确的。

    我还会将您推荐给微软员工Tess的Microsoft高级调试博客。谁建议以下柜台。我发现上述内容足以表明存在内存泄漏,但我相信Tess的指示可以提供更深入的洞察力。

    Debugging Demos - Memory Review

    • 所有堆中的.NET CLR内存/#字节
    • .NET CLR内存/大对象堆大小
    • .NET CLR内存/第2代堆大小
    • .NET CLR内存/第1代堆大小
    • .NET CLR内存/第0代堆大小
    • 流程/私人字节
    • 处理/虚拟字节

答案 1 :(得分:4)

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

但是,如果要使用性能计数器, this article解释了如何使用性能计数器来测试内存泄漏。

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

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

enter image description here