C# 如何控制连续运行windows服务的内存大小?

C# 如何控制连续运行windows服务的内存大小?,c#,database,windows-services,C#,Database,Windows Services,我已经创建了一个windows服务,它不断地轮询数据库。为此,我有一个计时器。每次查询数据库表时,我都会在工作完成后立即打开并关闭连接。现在我每20秒做一次测试,但稍后时间可能会增加到5-10分钟 每次轮询数据库表时,运行的服务的内存大小都会增加10-12KB。我可以在任务管理器中看到这一点。有什么方法可以控制它。一个.NET应用程序的内存是由CLR管理的,建议不要干扰它。相反,我建议您分析您的服务,并尝试了解它为什么会泄漏内存 您如何处理查询结果?是否将它们存储在内存中(某些静态对象) 确保在

我已经创建了一个windows服务,它不断地轮询数据库。为此,我有一个计时器。每次查询数据库表时,我都会在工作完成后立即打开并关闭连接。现在我每20秒做一次测试,但稍后时间可能会增加到5-10分钟


每次轮询数据库表时,运行的服务的内存大小都会增加10-12KB。我可以在任务管理器中看到这一点。有什么方法可以控制它。

一个.NET应用程序的内存是由CLR管理的,建议不要干扰它。相反,我建议您分析您的服务,并尝试了解它为什么会泄漏内存

您如何处理查询结果?是否将它们存储在内存中(某些静态对象)

确保在可使用资源(如
SqlConnection
SqlCommand
)周围使用
using


垃圾收集器应该负责释放资源

垃圾收集器最终应该启动并释放一些内存。它不是基于时间,而是基于记忆压力。因此,您应该能够通过增加轮询频率来模拟更长的持续时间。如果GC没有回收任何内存,那么您的某个地方有漏洞。另外,不要忘记数据库连接通常使用连接池,这意味着即使连接完成,仍有一个活动连接池在等待


但不立即回收内存是很正常的。抵制使用GC.Collect的冲动,除非它只是为了调试。这可能会影响垃圾收集器的效率。

检查是否存在内存泄漏。我使用Windbg实现此目的,如中所述:

  • !dumpheap-stat
    查看每种类型的统计信息
  • !dumpheap-type
    查看假定泄漏类型的实例
  • !gcroot
    跟踪锁定分配的参考(即泄漏原因)

将轮询间隔更改为1毫秒。您不必等待很长时间就可以看到垃圾收集器是否完成了它的工作。