【问题标题】:Perfmon counters to check memory leak用于检查内存泄漏的 Perfmon 计数器
【发布时间】:2012-11-08 13:16:29
【问题描述】:

我想检查我的服务中的内存泄漏问题。我尝试了以下一组性能计数器。

  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引用了上面的集合

是否有任何参数/标准或任何其他最佳方法来识别内存泄漏的 perfmon 计数器?
有人可以建议我设置一组计数器来检查内存泄漏吗?或者上面的集合涵盖了内存泄漏?

【问题讨论】:

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


【解决方案1】:

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

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

Source

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

我还建议您参阅 Microsoft 员工 Tess 撰写的 Microsoft Advanced Debugging 博客。谁建议以下柜台。我发现以上内容足以表明存在内存泄漏,但我相信 Tess 的说明可以更深入地了解该问题。

Debugging Demos - Memory Review

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

【讨论】:

  • 检查一些进程的Private bytes 和Page File Bytes,它们完全一样(即使有几GB 的可用物理内存)。这是否真的意味着整个进程的内存来自页面文件而不是物理内存,还是Page File Bytes的含义更细微?
【解决方案2】:

有更好的工具可用于简化内存泄漏测试,例如 RedGate ANTS Memory ProfilerJetBrains dotMemory Profiler

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-21
    • 1970-01-01
    • 2012-01-02
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2019-09-09
    • 2011-12-13
    相关资源
    最近更新 更多