在每天24小时运行的应用程序上使用GC.Collect是否明智?
我们的应用程序每天24小时运行,每周运行7天。 有时CPU达到100%然后回到80%。 与RAM相同。 几个小时后手动调用GC.Collect
或者自动离开它是否很聪明。
我们正在使用C#2010,SQL 2008和Fluent Nhiberanet。 这是桌面应用程序。
我不会称之为GC.Collect()
“每隔几个小时”,或“当RAM使用率变高”时称之为聪明,但是当你处于有更多信息的位置时,我会称它为聪明的。比GC,一些exmaples
- 你知道,这个大块的RAM或者你刚刚分配的这些小对象,将不再被使用,你处于一个单线程的环境中,并且(当然)你已经清除了所有的引用
- 你知道,“GC断裂”现在会减少伤害,而不是稍后
GC是一种高度优化的代码安静,非常智能,但它只能处理它所拥有的信息。
手动调用GC.Collect永远不是一个好主意,因为你应该调查为什么你的应用程序获得了那么多资源而不是每次你要达到100%时清理它们
看看下面我觉得它真的值得一读
第5章 – 提高托管代码性能
通常,框架本身将在需要时处理调用GC,您可以尝试运行它而无需自己调用一天
如果您持有不必要的引用或忘记取消订阅GC.Collect
将不会神奇地解决问题。 框架本身不时收集垃圾,所以我不相信每隔几个小时调用GC.Collect
可以改变任何东西。
简答:不。
垃圾收集器不是您想要进入的区域,除非您必须这样做。 通常,.net运行时在需要时可以很好地调用它。 如果你自己调用它只会是额外的开销。
我不会调用GC.Collect
– 这里和此处所描述的例外情况。
如果您有任何应用程序全天候运行,那么我会建议如下:
-
检查内存泄漏是否真的很难并纠正任何此类泄漏(使用多个内存分析器)
如果您需要任何链接,请说出来…… -
通过优化/重写代码,尽最大努力减少资源使用
-
将应用程序配置为在“服务器模式”下使用GC,因为它是为24/7情况设计的(有关详细信息,请参见此处 )
这不是一个奇迹解决方案,但您应该尝试使用您的应用程序,并比较它是否给您带来任何好处。