Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 长时间运行的windows服务存在内存泄漏?或者只是看起来像一个?_C#_Memory Leaks_Garbage Collection - Fatal编程技术网

C# 长时间运行的windows服务存在内存泄漏?或者只是看起来像一个?

C# 长时间运行的windows服务存在内存泄漏?或者只是看起来像一个?,c#,memory-leaks,garbage-collection,C#,Memory Leaks,Garbage Collection,这听起来有点奇怪,但我不确定我的进程是否有内存泄漏,我希望得到一些信息 最近,我被指派调查为什么生产中的windows服务消耗了大约1 gig的ram(它运行的服务器有8 gig)。这超出了我作为开发人员的经验范围,但这对我来说是一个很好的机会来了解垃圾收集是如何在msdn和其他源上工作的。但在这一点上,我对/collection实际运行的时间非常困惑,在这一点上,我读过的任何文章都是模糊的 1) 我发现了一个特定的操作,每次执行时都会增加约30kb的内存。 2) 我已经非常仔细地阅读了代码,并

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

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

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

基于此,我甚至不确定我是否有内存泄漏。考虑到GC是一个昂贵的过程,我是否可能仅仅因为还有可用ram而在生产中增长到1G,并且获得它比运行GC“更便宜”?特别是考虑到该服务每秒运行约6次?如果是这样,我有什么选择?我理解我不能强制触发GC,我有什么办法吗


感谢您提供的任何意见,我意识到csharp中的内存泄漏和gc是一个很深的主题,如果有关于这个主题的特别有用的阅读,我也很高兴被指出这一点。

您当然可以强制进行垃圾收集-只需调用gc.Collect即可。这并不是说你不能,而是垃圾收集器通常比你更能确定它应该在什么时候运行。但在这里,您可以显式调用它(作为调试工具),以查看分配的内存是否符合收集条件。

通常意味着内存永远不会释放,进程最终会崩溃。你是说它确实会在一段时间后被释放

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


您当然可以使用强制垃圾收集。但正如其他人所说,这不是一个好的长期解决方案。我强烈建议您阅读这篇文章中有关垃圾收集的内容。若您仍然确信存在内存泄漏,则可以使用在生产环境中创建进程的转储。并在以后使用。除非您可以使用或在生产环境中使用,否则这将非常容易。

您可以分享有关该服务实际运行情况的任何见解或代码吗?没有这一点很难帮上忙。而且,仅仅因为它占用1GB的ram并不一定意味着它在泄漏。让我们从另一个角度来看——它应该占用多少内存?Bryan,当我在开发或集成环境中运行服务时,工作集中大约需要10兆,专用字节大约需要70兆。它也会一直重新启动,因为环境并不太稳定。在QA环境中,工作集中大约需要30兆字节,专用字节大约需要70兆字节。然而,我注意到QA环境的内存使用率也总是在95%左右,所以我认为我们可能遇到了限制,触发了更频繁的GCs。没有字符。。。遗憾的是,QA和prod在执行频率上有很大的不同。谢谢,我以前没有看到API链接。我现在尝试一下,虽然我想我可能仍然可以选择,无论什么奇怪的情况触发了prod的泄漏,这只是我在开发中缺少的一个条件。但是如果我能在不同环境中保持这个东西稳定在一个很小的数量,我接受你的答案,因为我能够用它来证明在负载测试下,内存使用在我们所有的主要用例中保持不变。看起来奇怪的是,它会变得如此之大,所以我也增加了日志记录,以防一些奇怪的替代代码路径导致泄漏,我至少能够在下次发生时找到它。谢谢你的回答。