我创建了一个不断轮询数据库的Windows服务。为此,我有一个计时器。我一直在查询数据库表,我打开一个连接并在完成工作后立即关闭它。现在我每20秒做一次这样的测试,但是这个时间可能会增加到5-10分钟。
每次轮询数据库表时,运行的服务内存大小增加10-12 KB。我可以在任务管理器中看到。有没有办法控制这个。
答案 0 :(得分:1)
垃圾收集器最终应该启动并释放一些内存。它不是基于时间,而是基于记忆压力。因此,您应该能够通过增加轮询频率来模拟更长的持续时间。如果GC没有回收任何内存,那么你就会在某处泄漏。另外,请不要忘记数据库连接通常使用连接池,这意味着即使您已完成连接,仍会等待活动连接池。
但是看到记忆立刻被回收是很正常的。抵制使用GC.Collect的冲动,除非它只是用于调试。它可能会影响垃圾收集器的效率。
答案 1 :(得分:0)
.NET应用程序的内存由CLR管理,建议不要干扰它。我会建议你描述你的服务,并试着理解为什么它会泄漏内存。
您如何处理查询结果?你把它们存储在内存中(某些静态对象)吗?
确保在using
和SqlConnection
等可支配资源周围使用SqlCommand
块。
垃圾收集器应该注意释放资源。
答案 2 :(得分:0)
检查是否有内存泄漏。我使用Windbg,如CLR Memory Leak:
中所述!dumpheap -stat
查看每种类型的统计信息!dumpheap -type <LeakedTypeName>
查看假定泄露类型的实例!gcroot <AddressOfObject>
跟踪分配的引用(即泄漏的原因)。