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

时间:2012-01-23 13:56:40

标签: c# garbage-collection

我们的申请每天24小时,每周7天。有时CPU会达到100%然后再回到80%。与RAM相同。几小时后手动调用GC.Collect或者自动离开它是否明智。

我们正在使用C#2010,SQL 2008和Fluent Nhiberanet。这是桌面应用程序。

6 个答案:

答案 0 :(得分:11)

我不会把它称为“每隔几个小时GC.Collect()”,或者“当RAM使用量变高”时称之为智能,但是当你处于某个位置时,我会称之为智能。有比GC更多的信息,一些exmaples

  • 你知道,这块大块的RAM或你刚分配的很多小物件都不会再次使用,而且你处于一个单线程的环境中,并且(当然)你已经清除了所有的引用< / LI>
  • 你知道,“GC中断”现在会减少伤害,而不是稍后

GC是一种高度优化的代码安静,非常智能,但它只能处理它所拥有的信息。

答案 1 :(得分:2)

手动调用GC.Collect永远不是一个好主意,因为你应该调查为什么你的应用程序获得了那么多资源而不是每次你要达到100%时清理它们

看看下面的内容我认为值得一读

Chapter 5 — Improving Managed Code Performance

答案 2 :(得分:1)

通常,框架本身将在需要时处理GC 你可以尝试在没有自己调用一天的情况下运行它

答案 3 :(得分:1)

如果您持有不必要的引用或忘记取消订阅代理,

GC.Collect将不会神奇地解决问题。该框架不时收集垃圾,所以我不相信每隔几个小时调用GC.Collect就可以改变任何东西。

答案 4 :(得分:0)

简答:不。

垃圾收集器不是您想要进入的区域,除非您必须这样做。通常,.net运行时在需要时可以很好地调用它。如果你自己打电话,那将只是额外的开销。

答案 5 :(得分:0)

我不会打电话给GC.Collect - 如herehere所述的例外情况。

如果您有任何全天候运行的应用程序,那么我建议如下:

  • 检查内存泄漏是否真的很难并纠正任何此类泄漏(使用多个内存分析器)
    如果您需要任何链接,请说明......

  • 通过优化/重写代码来尽量减少资源使用

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