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