所以GC.Collect()

dev*_*ium 18 .net c# vb.net garbage-collection

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

mfa*_*mkh 28

我可以看到有几个人对于不建议调用GC.Collect变得极端.

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

  1. 一般情况下,不要担心调用它,GC会很好地调整自己,并且会做正确的事情.

  2. 有时,你最终会遇到这样的情况,你确定这是正确的调用时间,上面描述的情况恰好是调用它的时候,实际上Asp.Net在某些点上调用了GC.Collect.与你描述的相似.

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

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

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

    1. 你处于低内存状态,并且想要收集,如果你处于低内存状态,GC无论如何都会很激进,并且如果机器内存压力很高,它会自动启动
    2. 如果你想避免陷入低内存状态,你想急切地收集.

希望这可以帮助.
谢谢


Ste*_*ons 19

在原型化或构建应用程序并测试其性能之前,担心调用GC.Collect几乎总是过早优化.GC通常非常善于在适当的时间收集内存.当您的应用程序处于空闲状态时,它肯定会运行一个集合,尤其是在系统存在内存压力的情况下.

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


Ran*_*pho 7

几乎从来没有一个很好的理由打电话GC.Collect().

在你的情况下,绝对没有理由称之为.如果您闲置一小时,GC 进行收集.

  • 当您调用GC.Collect()时,任何未收集的对象都会被提升,以便它们在其他地方存活更长时间.有一个谷歌的"世代垃圾收集".就像现在可能没有针对您的应用程序的性能打击一样,它可能会在以后影响它. (8认同)
  • +1.调用GC.Collect()实际上可以提升对象的生命周期 (4认同)