我有一个运行在Windows Server 2008上的C#编写的.NET 4 Windows服务,当使用PerfMon进行监控时,它每小时消耗2500个句柄。 “手柄计数”计数器不断攀升。如何解决C#Windows服务中的句柄泄漏问题
当我使用ProcExp选择“显示未命名的句柄和映射”选项来查看句柄时,会列出数千个“事件”和“信号量”句柄。大多数似乎未命名。我查看了源代码,并没有明确使用AutoResetEvent或ManualResetEvent。
私人字节计数器攀升和下降。我没有看到这个过程超过几个小时,但会让它在一夜之间受到监控。
该服务在远程服务器上运行,因此我无法直接附加调试程序,并且可能必须转储该进程并使用WinDBG或类似工具进行分析。
是否可以找到其中一个手柄并找出它指向的内容和/或什么可能“拥有”它?如果是这样如何?
回复评论时,以下是对服务内容的总结。
- 主机一些WCF服务
- 主机Quartz.NET调度的实例
- 主机工作项队列(石英工作推进工作项目到一个队列,而不是做长期运行的工作本身)
- 主机工作项目执行人(工作项离队上的定时器,并从石英执行远)
- 主机自定义缓存管理器(它做了很多工作ADO.NET的)
听起来像一个艰难的。你的服务是做什么的?人们会认为它使用了一些在幕后做一些非管理性的API。也许如果你提到你使用的是哪些库,那会慢慢记住某人的记忆。否则,恐怕你会得到像“确保你打电话给.Dispose()”这样的答案。 – 2012-01-10 04:30:30
您的服务器是否使用非托管代码,并发集合,长轮询? – adontz 2012-01-10 05:08:46
感谢您的意见到目前为止。查看更新的说明。 – IanT8 2012-01-10 18:33:00