我在Windows Server 2008上运行用C#编写的.NET 4 Windows服务,在使用PerfMon监控时,每小时消耗2,500个句柄。 “Handle Count”计数器向上攀升。
当我使用ProcExp查看带有“显示未命名的句柄和映射”选项的句柄时,列出了数千个事件和信号量句柄。大多数人似乎都不知名。我查看了源代码,并没有明确使用AutoResetEvent或ManualResetEvent。
私人字节计数器攀升和下降。我没有看过这个过程超过几个小时,但会让它在一夜之间受到监控。
该服务在远程服务器上运行,因此我无法直接附加调试器,并且可能必须转储该进程并使用WinDBG或类似方法对其进行分析。
是否可以找到其中一个手柄并找出它指向的位置和/或可能“拥有”它的内容?如果是这样的话?
在回应评论时,这里是服务的概要。
答案 0 :(得分:1)
故障排除背后的基本概念是隔离。在流程和状态方面的隔离。
您需要做的第一件事是在您控制的环境中重现问题。尝试在您的开发机器上进行设置,如果在开发环境中设置需要太长时间的服务,请考虑将它们嘲笑。
一旦你掌控了环境,你就可以开始通过嘲笑它或者将它剔除来削减正在执行的代码。