所以GC.Collect()

好吧,我已经阅读了几个关于它的话题,但是在这里。 让我们想象一下,我有一个应用程序,基本上每隔一会儿我都会点击一个button,很多事情会发生几分钟,然后它会保持闲置一小时,或者只是一分钟。 那么在这之后不会有一个好的情况叫GC.Collect? 我的意思是,我知道那个时候我不会使用我的应用程序,GC也不会猜测它。

我可以看到,有几个人对于不build议调用GC.Collect已经极端了。

GC.Collect是有原因的,这里是我build议什么时候以及为什么要调用GC.Collect。

  1. 一般来说,不用担心这个问题,GC会自动调谐,并且会做正确的事情。

  2. 有时候,最终会出现这种情况,在这种情况下,您确实知道这是正确的时机,上面描述的情况恰恰是恰当的时机,实际上,Asp.Net在某些时候调用GC.Collect类似于你所描述的。

  3. GC是聪明的调用GC.Collect,如果你调用GC.Collect,GC可以覆盖你的决定,仍然不会收集(当你调用GC.Collect来select这种行为时,你必须设置一个标志),这是build议调用GC.Collect的方法,因为您仍在让GC决定是否是收集的好时机。

  4. 不要拿我的build议是一个调用GC.Collect的一般声明,你应该总是避免调用它,除非你真的确定你需要调用它,像你所描述的情况正是为什么GC.Collect在那里。

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

    1. 您处于内存不足状态,想要收集内存,如果处于内存不足状态,则无论如何GC都将会很激进,如果机器上的内存压力过高,将会自动启动
    2. 如果你想避免陷入低内存的情况,并希望收集热心。

希望这可以帮助。
谢谢

在原型或构build应用程序并testing其性能之前,担心调用GC.Collect几乎总是过早的优化。 GC通常非常擅长在适当的时间收集内存。 当你的应用程序空闲时,它肯定会运行一个集合,特别是当系统中存在内存压力时。

遵循良好的代理GC分配实践(小对象,短使用等)更重要的是,您可能会得到您想要的性能特征。 如果你还没有你需要的性能,在分析和devise好之后,你可能会想到GC.Collect作为解决scheme。

几乎从来没有一个很好的理由来调用GC.Collect()

在你的情况下,绝对没有理由去调用它。 如果你闲了一个小时,GC 收集。

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

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

不build议显式调用GC.Collect,因为

  1. 它会抛弃CLR GC Tuningalgorithm。 调谐器确定何时自动触发GC,并强制手动GC计算。

  2. 通过手动强制收集,您最终可以将一个物品提升一代 – 可能在下一个GC中收集的物品(如果它们在GC决定启用之前“孤立”)。

您可能会发现有趣的是.NET 4.0,一个GC通知机制已经被引入这种情况。

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

换句话说,如果你真的知道什么时候需要调用GC.Collect() ,而且不是在其他代码中做得不好,那么你可能为CLR内部工作,并可以解决这个问题。

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

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

如果调用GC将使您安心,那么继续。 这可能不会有帮助,但它肯定不会受到伤害。

就像在其他post中提到的那样,GC知道什么时候开始收集比你更好,在应用程序中没有button被点击的因素并不意味着是开始清理的时候,GC在移动对象时正在做某种types的locking,如果你滥用GC.Collect,这可能会导致性能低下