Performance 用于检查内存泄漏的Perfmon计数器

Performance 用于检查内存泄漏的Perfmon计数器,performance,memory-leaks,performancecounter,perfmon,memory-leak-detector,Performance,Memory Leaks,Performancecounter,Perfmon,Memory Leak Detector,我想检查我的服务中的内存泄漏问题。我尝试了以下一组性能计数器 所有堆中的.NET CLR内存\#字节 .NET CLR内存\Gen 2堆大小 .NET CLR内存\#GC句柄 固定对象的.NET CLR内存\# .NET CLR内存\#提交的总字节数 .NET CLR内存\#总保留字节数 .NET CLR内存\大对象堆大小 我是从一开始就提到这一套的 也指以下一套: 内存/可用字节 内存/提交字节 进程/专用字节 进程/页面文件字节 进程/句柄计数 我是从一开始就提到这一套的 是否有任何参数/标

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

  • 所有堆中的.NET CLR内存\#字节
  • .NET CLR内存\Gen 2堆大小
  • .NET CLR内存\#GC句柄
  • 固定对象的.NET CLR内存\#
  • .NET CLR内存\#提交的总字节数
  • .NET CLR内存\#总保留字节数
  • .NET CLR内存\大对象堆大小
  • 我是从一开始就提到这一套的

    也指以下一套:

  • 内存/可用字节
  • 内存/提交字节
  • 进程/专用字节
  • 进程/页面文件字节
  • 进程/句柄计数
  • 我是从一开始就提到这一套的

    是否有任何参数/标准或任何其他最佳方法来识别内存泄漏的性能计数器?

    有人能给我推荐一套计数器来检查内存泄漏吗?或以上设置覆盖内存泄漏?

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

  • 内存/可用字节计数器用于查看可用内存的总字节数。该值通常会波动,但如果 您有一个内存泄漏的应用程序,它将随着时间的推移而减少 时间
  • 如果发生内存泄漏,memory/Committed Bytes计数器将稳步上升,因为 内存减少,提交的字节数增加
  • Process/Private Bytes计数器显示专门为特定进程保留的字节数。如果发生内存泄漏 一旦发生,该值将趋于稳定上升
  • 进程/页面文件字节计数器显示页面文件的大小。Windows使用虚拟内存(页面文件)来补充 机器的物理内存。当机器的物理内存开始 填满后,内存页将移动到页面文件中。这是正常的 即使在内存充足的机器上也可以使用页面文件。但是 如果页面文件的大小稳步增加,这是一个好迹象 内存泄漏正在发生
  • 我还想提到进程/句柄计数计数器。应用程序使用句柄来标识它们必须使用的资源 通道如果发生内存泄漏,应用程序通常会 创建其他句柄以标识内存资源。因此,在 句柄计数可能表示内存泄漏。然而,并非所有 内存泄漏将导致句柄计数增加
  • 根据我的经验,这是准确的

    我还想让您参考由微软员工苔丝撰写的这篇微软高级调试博客。世卫组织建议使用以下计数器。我发现上面的内容足以说明内存泄漏的存在,但我相信Tess的指示可以更深入地了解这个问题

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

    有更好的工具可以使内存泄漏测试更容易,例如和

    但是,如果要使用性能计数器, 说明如何使用性能计数器测试内存泄漏

    请记住,垃圾收集不会在某个实例处理后立即释放内存。它经过优化,仅在内存紧张时触发和释放内存。所以,如果您想测试内存泄漏,您应该在读取计数器读数之前手动执行垃圾收集

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

    这是一篇很好的文章,检查一些进程的私有字节和页面文件字节,它们完全相同(即使有几GB的可用物理内存)。这真的意味着整个过程的内存来自页面文件而不是物理内存,还是页面文件字节的含义更细微?