在每天运行24小时的应用程序中使用GC.Collect是否明智?

5
我们有一个每天24小时,每周7天运行的应用程序。有时CPU会达到100%,然后回到80%。RAM也是如此。手动调用 GC.Collect 几个小时后是否明智,还是最好自动留给它处理。
我们使用C# 2010,SQL 2008和Fluent Nhiberanet。这是一个桌面应用程序。

1
一般情况下,如果应用程序编写正确,则不需要调用它。尽管如此,在我们的Web应用程序中,特别是在分配byte[] > 50 MB之后,有时我们会调用它,并且我们注意到内存会更快地释放,但在收集期间CPU使用率会更高。 - Davide Piras
2
请查看http://blogs.msdn.com/b/scottholden/archive/2004/12/28/339733.aspx,它解释了何时以及何时不应调用GC.Collect。 - codingbunny
桌面应用程序24/7运行?为什么不使用服务? - Oskar Kjellin
我会反问你,为什么你认为需要调用它? - Chris Dunaway
6个回答

11

我不认为每隔几个小时或当RAM使用率过高时调用GC.Collect()是明智的,但当你拥有比GC更多的信息时调用它是明智的。以下是一些例子:

  • 您知道,您刚刚分配的这个大块内存或这么多小对象将不会再次使用,并且您处于单线程环境中(当然),您已清除了所有引用
  • 您知道,现在进行“GC中断”比稍后进行要好一些

GC是一段高度优化的代码,非常智能,但它只能根据它所拥有的信息工作。


2

手动调用 GC.Collect 绝不是个好主意,你应该探究为什么你的应用程序会占用这么多资源,而不是每次接近 100% 时都清理它们。

看一下下面的内容,我认为这真的值得一读:

第 5 章 — 改进托管代码性能


1

通常框架本身会在需要时处理调用GC,您可以尝试在一天内不自己调用它来运行它。


1

GC.Collect 不会神奇地解决问题,如果您持有不必要的引用或忘记取消委托,则无济于事。框架会定期自行收集垃圾,因此我不认为每隔几个小时调用 GC.Collect 会改变任何东西。


0
短而直接的回答:不需要。
垃圾收集器并不是你想要进入的领域,除非你必须这样做。通常情况下,.net运行时会在需要时自动调用它,所以你不需要手动调用它,否则只会增加额外负担。

0

我建议不要调用GC.Collect - 除非有像这里这里描述的特殊情况。

如果您有任何24/7运行的应用程序,则建议执行以下操作:

  • 仔细检查内存泄漏并纠正任何此类泄漏(使用多个内存分析器)
    如果需要任何链接,请告诉我...

  • 尽最大努力通过优化/重写代码来减少资源使用

  • 将应用程序配置为在“服务器模式”下使用GC,因为该模式适用于24/7情况(有关详细信息,请参见这里
    这不是一个神奇的解决方案,但您应该尝试一下,并比较它是否给您带来任何好处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接