如何解决C#Windows服务中的句柄泄漏问题

Ian*_*nT8 5 .net c# windows memory-leaks windows-services

我在Windows Server 2008上运行用C#编写的.NET 4 Windows服务,在使用PerfMon监控时,每小时消耗2,500个句柄."Handle Count"计数器向上攀升.

当我使用ProcExp查看带有"显示未命名的句柄和映射"选项的句柄时,会列出数千个事件和信号量句柄.大多数人似乎都不知名.我查看了源代码,并没有明确使用AutoResetEvent或ManualResetEvent.

私人字节计数器爬升和下降.我没有看过这个过程超过几个小时,但会让它在一夜之间受到监控.

该服务在远程服务器上运行,因此我无法直接连接调试器,并且可能必须转储该进程并使用WinDBG或类似方法对其进行分析.

是否可以找到其中一个手柄并找出它指向的位置和/或可能"拥有"它的内容?如果是这样的话?

在回应评论时,这里是服务的功能摘要.

  • 托管一些WCF服务
  • 托管Quartz.NET调度程序的一个实例
  • 托管工作项队列(quartz jobs将工作项推送到队列而不是长时间运行工作)
  • 托管工作项执行程序(工作项在计时器上出列并从Quartz执行)
  • 托管一个自定义缓存管理器(它做了很多ADO.NET工作)

Slu*_*art 1

故障排除背后的基本概念是隔离。进程和状态方面的隔离。

您需要做的第一件事是在您控制的环境中重现问题。尝试在您的开发计算机上进行设置,如果在开发环境中设置某些服务需要很长时间,请考虑模拟它们。

一旦您控制了环境,您就可以通过模拟或存根来开始削减正在执行的代码。