好吧,我读过一对夫妇关于它的话题,但在这里不言而喻。 让我们想象一下我有一个应用程序,基本上每一个现在,然后我会点击一个按钮,很多事情会发生几分钟,然后它会留下闲置可能一个小时,或者也许只是1分钟。 会不会只是整个结束之后的良好局面,以调用GC.Collect? 我的意思是,我不知道,就在那一刻,我不会用我的应用程序之中,而GC不能猜出它。
Answer 1:
我可以看到几个人都走了极端不左右推荐给调用GC.Collect。
所以GC.Collect是有原因的,这里有我的时候,为什么要调用GC.Collect的推荐。
一般情况下,不用担心调用它,GC曲调本身非常好,会做正确的事。
有时候,你的情况下结束了,你肯定知道这是调用它正确的时间,你上述的情况是完全正确的时间来调用它,事实上Asp.Net在某些点是调用所以GC.Collect类似于你所描述的。
在GC是聪明调用GC.Collect的,如果你叫GC.Collect的,气相色谱可以覆盖你的决定,仍然没有收集(你有,当你调用GC.Collect选择这个行为设置标志),这是所以GC.Collect打电话,因为你仍然让GC的推荐方式决定,如果它是一个很好的时间来收集。
不要把我的建议是,你应该始终避免调用它,除非你真的确定你需要调用它,就像一个情况下,你描述的正是为什么GC.Collect的是有调用GC.Collect的一般性发言。
你会从调用它正在迅速释放的垃圾得到的好处,通常你会在乎这种情况下,如果
- 您是在内存不足的情况,并希望成为渴望约集合,如果你是在内存不足的情况,GC将是积极不管怎样,如果内存压力高在机器上就会自动踢
- 如果你想避免让在内存不足的情况,并要收集热切。
希望这可以帮助。
谢谢
Answer 2:
这几乎总是过早优化担心调用GC.Collect的你原型或构建的应用程序和测试其性能之前。 该GC通常是在适当的时间收集内存非常好。 它必将运行的集合,而你的应用程序空闲,尤其是如果有在系统内存压力。
这是更为重要的是,你遵循良好的代GC分配的做法(小物件,短期使用等),你可能会得到你想要的性能特点。 如果你还没有,你需要的性能,经过分析和良好的设计,你可能会想到GC.Collect的一个解决方案。
Answer 3:
有几乎从来没有一个很好的理由来调用GC.Collect()
在你的情况,也绝对没有理由骂它。 如果一个小时是闲置的,GC 将尽自己的藏品。
Answer 4:
我希望你知道,调用GC.Collect的不会引起更多(或更少)对象被收集。
如果你想优化的时候,你知道GC需要收集在应用程序中的对象的时候? 在桌面操作系统(XP,VISTA等),CLR使用并发GC,它可以在不进行采集的时间申请暂停所有线程运行。
显式调用不建议GC.Collect的原因
它抛出CLR GC调整算法进行齿轮。 调谐器确定何时自动触发GC,并迫使手动GC混乱其计算。
通过手动强制集合,你可以最终推动物体起来的一代 - 对象可能已在接下来的GC被收集(如果他们被“孤立”前的GC决定踢)。
你可能会觉得有趣的是.NET 4.0中, GC通报机制已引入这些类型的场景。
Answer 5:
要知道何时调用GC.Collect()
你需要知道有关与大约一个薄弱点,你可以用收集解决的详细信息以及运行的具体收集的细节。
换句话说,如果你真的知道你什么时候需要调用GC.Collect()
它不是东西,你会在其他代码做得不好,那么你可能对工作CLR内幕 ,可以只解决这个问题。
Answer 6:
一般来说,如果你尝试分配新的内存GC只调用。 如果你不运行的内存,你调用GC获得0%的性能提升。 你必须有一个非常疯狂的资源密集型应用程序,甚至接近的RAM在当今电脑的限制。
如果程序有大量的外部资源(如文件或COM / DCOM的引用),你可能会想打电话GC。
如果调用GC会给你安心,然后继续前进。 它可能不会帮助,但它肯定不会伤害。
Answer 7:
是啊,在其他帖子提到的GC知道什么时候开始收集比你更好,没有按钮被点击您的应用程序并不意味着它要开始清洗时间因素,GC移动对象时做某种lockings的,因此这可能导致低性能,如果你会滥用GC.Collect的