调用.net垃圾收集器会更有效吗?

时间:2009-11-30 01:41:25

标签: c# optimization garbage-collection clr performance

由于在CLR中调用垃圾收集器的开销,离开它是否更有效,或者当对象超出范围时强制进行垃圾收集?

5 个答案:

答案 0 :(得分:8)

自己调用GC的一个主要原因是,由于GC是自我调整的,因此从托管堆中收集的任何调用都将有效地破坏任何自调整GC已代表您的应用程序完成。

GC将要做的主要事情之一是调整在托管堆的三代中每一代上触发垃圾收集的阈值,以减少应用程序所需的集合数。

对于除极端情况以外的所有情况,最好允许GC完成其工作,而不必担心手动调用它。只有当您确定了明确的需求时,才应手动调用集合。

答案 1 :(得分:5)

大多数情况下,手动调用垃圾收集器是不值得的。您会对底层垃圾收集器算法的效率感到惊讶。

除非您在金融应用程序(例如:衍生交易应用程序)中工作,否则您需要完全控制垃圾收集器被调用的时间。但是如果你要进入那条路线,也许你应该尝试其他语言,比如C ++

答案 2 :(得分:5)

除了Andrew的评论之外,不必要地调用GC.Collect将导致其他高效的Gen-0收集被推入Gen-1和Gen-2桶中,这些桶的收集频率要低得多。具有讽刺意味的是,这意味着您的应用程序将受到长期内存使用量增加的影响,从而失去了减少内存使用量的初衷。

需要调用GC.Collect的少数情况之一是在使用COM或Win32时。例如,Office中的COM对象挂起的时间比预期的要长,这种情况并不少见,因为无法明确处理它们。因此,您可能希望COM包装器在特定时间进行GC,并且通常会调用WaitForPendingFinalizers。

答案 3 :(得分:2)

编写.NET和垃圾收集器的人对它进行了很多考虑,因此您不必这样做。如果适用,只需在您的对象上调用dispose,不要担心其余部分。

答案 4 :(得分:1)

  

由于在CLR中调用垃圾收集器的开销,离开它是否更有效,或者当对象超出范围时强制进行垃圾收集?

几乎可以更有效率地让它独自存在。

另外,请注意,源代码中超出范围的对象仅与收集它们的GC有关。在GC与之交互之前,您的程序会经历许多转换,到那时,范围的概念几乎完全丢失。