长时间运行有内存泄漏的windows服务?或者只是看起来像

本文关键字:或者 看起来 服务 windows 运行 内存 泄漏 长时间 | 更新日期: 2023-09-27 18:06:25

这听起来有点奇怪,但我不确定我的进程是否有内存泄漏,我希望得到一些信息。

我最近被分配了一项调查,调查为什么一个windows服务在生产环境中消耗大约1g的内存(它运行的服务器有8g内存)。这超出了我作为开发人员的经验范围,但这对我来说是一个很好的机会,可以了解垃圾收集是如何在msdn和其他资源上工作的。但是在这一点上,我对//collection实际运行的时间非常困惑,在这一点上,我读过的每一篇文章都是模糊的。

1)我发现了一个特定的操作,每次执行它都会增加约30kb的内存。2)我非常仔细地检查了代码,并相信我正确地关闭了所有内容,并删除了引用3)我使用了几个内存分析器,它们似乎都表明我的旧对象链接到gc。4)如果我让进程完全空闲几天,内存使用量突然下降到~8 mb

因此,基于此,我甚至不确定我有内存泄漏。考虑到GC是一个昂贵的过程,我在生产环境中增长到1gig是否可能只是因为仍然有可用的ram,并且获得它比运行GC"更便宜"?特别是考虑到这个服务每秒运行6次?如果是这样的话,我有什么选择?我明白我不能强制触发GC,我有什么办法吗?

感谢您的任何输入,我意识到内存泄漏和gc在csharp是一个深刻的话题,如果有一个特别有用的阅读这个主题,我也很高兴被指出来。

长时间运行有内存泄漏的windows服务?或者只是看起来像

你当然可以强制垃圾回收-只需调用GC.Collect。这并不是说您不能这样做,而是垃圾收集器通常比您能更好地判断何时应该运行。但是在这里,您可以显式地调用它—作为调试工具—来查看分配的内存是否适合收集。

内存泄漏通常意味着内存永远不会被释放,进程最终会因OutOfMemoryException而崩溃。你的意思是它会在一段时间后被释放

4)如果我让进程完全空闲几天,内存使用量突然下降到~8兆

你当然可以使用GC.Collect强制垃圾回收。但正如其他人所说,这不是一个好的长期解决方案。我强烈建议您阅读这本书中有关垃圾收集的内容。如果您仍然确信存在内存泄漏,可以使用process Explorer在生产环境中创建进程的转储。然后使用WinDbg对其进行分析。除非您可以在生产中使用dotTrace或ANTS,否则会容易得多。