用.net 4.0系统处理泄漏

本文关键字:处理 泄漏 系统 net | 更新日期: 2023-09-27 17:52:33

我使用windows 2003 R2和windows 2008 R2与。net框架4.0(64位)。

我有一个OLTP窗口服务,它监听套接字上的消息并创建线程来处理每个消息。应用程序预计每秒最多处理200个事务,但负载不时变化(平均每天约80 TPS)。我们面临的问题是,由于某些原因,应用程序正在创建句柄,而不是删除它们。我使用了ProcessExplorer工具,发现增加的句柄是事件句柄,所有其他类型的句柄都在定期释放。当发生这种情况时,在执行一两天之后,句柄计数增加太多,我的应用程序会因OutOfMemory异常而崩溃。

我还使用ProcessExplorer验证了所有未被释放的事件句柄至少有一个引用。我的问题是我无法控制它们,因为我的程序没有显式地创建任何句柄。我自然怀疑CLR,经过调查,我找到了https://connect.microsoft.com/VisualStudio/feedback/details/430646/thread-handle-leak#tabs引用:"微软于2009年4月8日12:39 PM发布

感谢您的反馈。我是公共语言运行时(CLR)团队的线程开发人员。您报告的问题是CLR中已知的问题,我们正在努力在未来的版本中修复它。问题是CLR线程句柄(和其他相关的数据结构)是由终结器线程清理的,它通常只在响应垃圾收集(GC)时运行。如果在GC发生之前创建和销毁了许多线程(如果在此期间内存分配很少,就会出现这种情况),那么它就会产生"泄漏"句柄和内存的效果,尽管这些将在下次触发终结时被回收。一个解决方法是通过调用gc . waitforpendingfinalizer周期性地手动触发终结。正如我所说,我们正在努力在未来的CLR版本中纠正这个错误。

Ed Nicholas于4/7/2009 at 8:20 AM发布在同一页面上,微软已将此问题标记为已修复,但我没有看到哪个版本的CLR包含修复。

我已经检查了以下的线程/链接。

使用。net System.Threading.Thread类处理泄漏

https://connect.microsoft.com/VisualStudio/feedback/details/430646/thread-handle-leak

谁能提出一个可行的解决方案?提前谢谢。

瓦吉德Hussain

用.net 4.0系统处理泄漏

我也遇到过类似的问题,结果证明这与安装的防病毒软件有关。在安全模式下试用软件并/或禁用杀毒软件。如果有帮助的话,您可以按照Jim Mischel建议的方式解决这个问题:使用队列和持久线程精心设计您的消息。(向杀毒软件提供商投诉也是一种解决方案。)我还建议在创建大量线程时阅读.Net内存泄漏的注释