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

时间:2012-01-10 04:20:52

标签: c# .net 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工作)

1 个答案:

答案 0 :(得分:1)

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

您需要做的第一件事是在您控制的环境中重现问题。尝试在您的开发机器上进行设置,如果在开发环境中设置需要太长时间的服务,请考虑将它们嘲笑。

一旦你掌控了环境,你就可以开始通过嘲笑它或者将它剔除来削减正在执行的代码。