所以GC.Collect()

时间:2009-07-19 03:48:17

标签: c# .net vb.net garbage-collection

好的,我已经阅读了几个关于它的主题,但是在这里。让我们想象一下,我有一个应用程序,基本上每时每刻我都会点击一个按钮,很多事情都会发生几分钟,然后它会闲置一小时,或者只是1分钟。不会在整个结束好的情况后调用GC.Collect吗?我的意思是,我知道就在那一刻我不会使用我的应用程序,GC也无法猜到它。

7 个答案:

答案 0 :(得分:28)

我可以看到有几个人因为不建议打电话给GC.Collect而走极端。

GC.Collect是有原因的,这里是我建议何时以及为何调用GC.Collect。

  1. 总的来说,不要担心打电话,GC会很好地调整自己并做正确的事。

  2. 有时,你最终会知道这是正确的时间来调用它,上面描述的情况恰好是调用它的时候,实际上Asp.Net调用了GC。收集与您描述的类似的某些点。

  3. GC很聪明地调用GC.Collect,如果你调用GC.Collect,GC可以覆盖你的决定而仍然不收集(当你调用GC.Collect来选择时你必须设置一个标志这个行为),这是调用GC.Collect的推荐方法,因为你仍然让GC决定是否是收集的好时机。

  4. 不要把我的推荐作为调用GC.Collect的一般声明,你应该总是避免调用它,除非你真的确定需要调用它,你所描述的情况就是GC的原因。收集就在那里。

  5. 通过调用它可以获得的好处是快速释放垃圾,一般情况下你会关心这种情况

    1. 你处于低内存状态,并且想要收集,如果你处于低内存状态,GC无论如何都会很激进,并且如果机器上的内存压力很高,它会自动启动
    2. 如果你想避免陷入低内存状态而你想急切地收集。
  6. 希望这有帮助。
    感谢

答案 1 :(得分:19)

在构建应用程序并构建应用程序并测试其性能之前,担心调用GC.Collect几乎总是过早优化。 GC通常非常善于在适当的时间收集内存。当应用程序空闲时,它肯定会运行一个集合,特别是如果系统中存在内存压力。

遵循良好的世代GC分配实践(小对象,短期使用等)更为重要,您可能会获得您想要的性能特征。如果您仍然没有所需的性能,在分析和良好的设计之后,您可能会考虑将GC.Collect作为解决方案。

答案 2 :(得分:6)

几乎没有理由打电话给GC.Collect()

在您的情况下,绝对没有理由称之为。如果您闲置一小时,GC 执行其收藏。

答案 3 :(得分:4)

我希望你知道调用GC.Collect不会导致收集更多(或更少)的对象。

如果您正在尝试优化时间,您是否知道GC在应用程序中收集对象所需的时间?在桌面操作系统(XP,Vista等)上,CLR使用并发GC,它可以在收集期间不挂起应用程序中的所有线程而运行。

建议不要明确调用GC.Collect,因为

  1. 它会使CLR GC Tuning算法失效。调谐器确定何时自动触发GC,并通过计算强制手动GC混乱。

  2. 通过手动强制收集,您最终可以将对象推向一代 - 可能已在下一个GC中收集的对象(如果它们在GC决定启动之前是“孤立的”)。

  3. 您可能会觉得有趣的是.NET 4.0,GC notification mechanism已经针对这些场景引入了。

答案 4 :(得分:1)

要知道何时调用GC.Collect(),您需要了解运行时所涉及的特定收集器的详细信息,以及有关可以使用该集合解决的弱点的详细信息。

换句话说,如果你真的知道什么时候需要拨打GC.Collect(),并且这不是你在其他代码中做得不好的话,那么你可能会为CLR Internals工作而且可以修复问题

答案 5 :(得分:0)

通常只有在尝试分配新内存时才会调用GC。如果内存不足,则通过调用GC可以获得0%的性能提升。您必须拥有一个非常疯狂的资源密集型应用程序,甚至接近当今计算机上的RAM限制。

如果您的程序有很多外部资源(如文件或COM / DCOM引用),您可能希望调用GC。

如果致电GC会让您高枕无忧,那就继续吧。它可能没有帮助,但它肯定不会受到伤害。

答案 6 :(得分:0)

是的,正如其他帖子中提到的那样,GC知道何时开始收集比你更好,在你的应用程序中没有点击按钮的因素并不意味着是时候开始清理了,GC正在进行某种锁定移动对象,如果您滥用GC.Collect

,这可能会导致性能低下