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

时间:2010-03-18 06:40:46

标签: c# database windows-services

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

每次轮询数据库表时,运行的服务内存大小增加10-12 KB。我可以在任务管理器中看到。有没有办法控制这个。

3 个答案:

答案 0 :(得分:1)

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

但是看到记忆立刻被回收是很正常的。抵制使用GC.Collect的冲动,除非它只是用于调试。它可能会影响垃圾收集器的效率。

答案 1 :(得分:0)

.NET应用程序的内存由CLR管理,建议不要干扰它。我会建议你描述你的服务,并试着理解为什么它会泄漏内存。

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

确保在usingSqlConnection等可支配资源周围使用SqlCommand块。

垃圾收集器应该注意释放资源。

答案 2 :(得分:0)

检查是否有内存泄漏。我使用Windbg,如CLR Memory Leak

中所述
  • !dumpheap -stat查看每种类型的统计信息
  • !dumpheap -type <LeakedTypeName>查看假定泄露类型的实例
  • !gcroot <AddressOfObject>跟踪分配的引用(即泄漏的原因)。