21

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

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

我从这里提到了上面的集合

还参考了以下集合:

  1. 内存/可用字节
  2. 内存/提交的字节
  3. 处理/私有字节
  4. 进程/页面文件字节
  5. 进程/句柄计数

我从这里提到了上面的集合

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

4

2 回答 2

33

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

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

来源

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

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

调试演示 - 内存回顾

  • .NET CLR 内存/# 所有堆中的字节数
  • .NET CLR 内存/大对象堆大小
  • .NET CLR 内存/第 2 代堆大小
  • .NET CLR 内存/第 1 代堆大小
  • .NET CLR 内存/第 0 代堆大小
  • 处理/私有字节
  • 进程/虚拟字节
于 2013-04-04T14:07:56.053 回答
4

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

但是,如果您想使用性能计数器, 本文将介绍如何使用性能计数器来测试内存泄漏。

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

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

在此处输入图像描述

于 2015-07-26T01:27:44.123 回答