作为Windows服务而不是作为控制台应用程序运行时,C#内存泄漏

时间:2018-09-14 13:08:57

标签: c# garbage-collection windows-services out-of-memory

更新 我将内存泄漏问题归结为以下原因:该程序作为Windows服务运行时发生了内存泄漏,而作为控制台应用程序运行时则没有。

使用ANTS Memory Profiler,我发现泄漏的内存是由终结器队列的GC根保留的。 所以问题就变成了:当程序作为Windows服务运行时,为什么对象会卡在终结器队列中?

原始问题

我正在用C#开发Windows服务。它定期从网络设备收集数据。目标框架是4.6。

我使用TPL ActionBlock能够并行发送请求。

我的问题:如果我将应用程序作为常规控制台应用程序运行,则内存使用情况保持正常。 (100 MB)在调试器中,可以看到垃圾回收定期插入。

当应用程序作为Windows服务在会话0中运行时,内存使用率增加到内存不足异常。 (6GB) 将Visual Studio调试器附加到Windows服务-它表明GC有时会发生,但不像常规控制台中那样频繁。

有趣的是:这发生在Win10上。在一台Win7虚拟机上-该内存问题在服务中存在,并且也作为控制台应用程序运行。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

使用ANTS Memory Profiler,我发现泄漏的内存是由终结器队列的GC根保留的。

这个问题使我想到了解决方案: How can I find the reason for a hung finalizer queue?

我将WinForms应用程序转换为控制台应用程序,然后转换为Windows服务。我在Main方法之前留下了[STAThread]备注。当程序作为Windows服务运行时,这导致终结器队列挂起。