我有一个用 C# 编写的 .NET 4 Windows 服务,运行在 Windows Server 2008 上,当使用 PerfMon 监控时,它似乎每小时消耗 2,500 个句柄。 “处理数”计数器一直向上攀升。
当我使用选中“显示未命名句柄和映射”选项的 ProcExp 查看句柄时,列出了数以千计的事件和信号量句柄。大多数似乎没有名字。我查看了源代码,没有明确使用 AutoResetEvent 或 ManualResetEvent。
Private Bytes 计数器上升和下降。我已经有两个多小时没看过这个过程了,但会在一夜之间对其进行监控。
该服务在远程服务器上运行,因此我无法直接附加调试器,并且可能必须转储进程并使用 WinDBG 或类似工具对其进行分析。
是否有可能找到其中一个句柄并找出它指向什么和/或什么可能“拥有”它?如果是怎么办?
作为对评论的回应,这里总结了该服务的作用。
- 托管一些 WCF 服务
- 托管 Quartz.NET 调度器实例
- 托管工作项队列(quartz 作业将工作项推送到队列而不是自己执行长时间运行的工作)
- 托管一个工作项执行器(工作项在计时器上出列并在 Quartz 之外执行)
- 托管自定义缓存管理器(它执行大量 ADO.NET 工作)
最佳答案
故障排除背后的基本概念是隔离。进程和状态的隔离。
您需要做的第一件事是在您控制的环境中重现问题。尝试在您的开发机器上设置它,如果有服务在开发环境中设置时间太长,请考虑模拟它们。
一旦您控制了环境,您就可以开始削减正在执行的代码,方法是模拟它或将其 stub 。
关于c# - 如何解决 C# Windows 服务中的句柄泄漏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8798524/