更新 我将内存泄漏问题归结为以下原因:该程序作为Windows服务运行时发生了内存泄漏,而作为控制台应用程序运行时则没有。
使用ANTS Memory Profiler,我发现泄漏的内存是由终结器队列的GC根保留的。 所以问题就变成了:当程序作为Windows服务运行时,为什么对象会卡在终结器队列中?
原始问题
我正在用C#开发Windows服务。它定期从网络设备收集数据。目标框架是4.6。
我使用TPL ActionBlock能够并行发送请求。
我的问题:如果我将应用程序作为常规控制台应用程序运行,则内存使用情况保持正常。 (100 MB)在调试器中,可以看到垃圾回收定期插入。
当应用程序作为Windows服务在会话0中运行时,内存使用率增加到内存不足异常。 (6GB) 将Visual Studio调试器附加到Windows服务-它表明GC有时会发生,但不像常规控制台中那样频繁。
有趣的是:这发生在Win10上。在一台Win7虚拟机上-该内存问题在服务中存在,并且也作为控制台应用程序运行。
非常感谢您的帮助!
答案 0 :(得分:1)
使用ANTS Memory Profiler,我发现泄漏的内存是由终结器队列的GC根保留的。
这个问题使我想到了解决方案: How can I find the reason for a hung finalizer queue?
我将WinForms应用程序转换为控制台应用程序,然后转换为Windows服务。我在Main方法之前留下了[STAThread]
备注。当程序作为Windows服务运行时,这导致终结器队列挂起。