2012-01-10 43 views
5

我有一个运行在Windows Server 2008上的C#编写的.NET 4 Windows服务,当使用PerfMon进行监控时,它每小时消耗2500个句柄。 “手柄计数”计数器不断攀升。如何解决C#Windows服务中的句柄泄漏问题

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

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

该服务在远程服务器上运行,因此我无法直接附加调试程序,并且可能必须转储该进程并使用WinDBG或类似工具进行分析。

是否可以找到其中一个手柄并找出它指向的内容和/或什么可能“拥有”它?如果是这样如何?

回复评论时,以下是对服务内容的总结。

  • 主机一些WCF服务
  • 主机Quartz.NET调度的实例
  • 主机工作项队列(石英工作推进工作项目到一个队列,而不是做长期运行的工作本身)
  • 主机工作项目执行人(工作项离队上的定时器,并从石英执行远)
  • 主机自定义缓存管理器(它做了很多工作ADO.NET的)
+0

听起来像一个艰难的。你的服务是做什么的?人们会认为它使用了一些在幕后做一些非管理性的API。也许如果你提到你使用的是哪些库,那会慢慢记住某人的记忆。否则,恐怕你会得到像“确保你打电话给.Dispose()”这样的答案。 – 2012-01-10 04:30:30

+0

您的服务器是否使用非托管代码,并发集合,长轮询? – adontz 2012-01-10 05:08:46

+0

感谢您的意见到目前为止。查看更新的说明。 – IanT8 2012-01-10 18:33:00

回答

1

故障排除的基本概念是隔离。隔离的过程和状态。

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

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