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

标签 c# .net windows memory-leaks windows-services

我有一个用 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/

相关文章:

c# - 在 MouseOver 上重绘按钮图形或单击

c# - 如何确定 Windows 何时完成重启?

C# - 对字符串的 ArrayList 进行排序

c# - 在 'foreach' 循环中修改列表的最佳方法是什么?

windows - 如何从当前目录中删除文件夹及其所有内容?

c# - Entity Framework : Create database column without property in model class

c# - XmlSerializer 添加属性

c++ - 为什么 INTEGRAL_MAX_BITS 会返回小于 64 的值?

windows - 我应该在批处理文件中使用哪种注释样式?

c# - 如何抑制 thread.abort() 错误 C#?