好的,我读了一些相关主题,现在让我们来假设一个情况。假设我有一个应用程序,在这个应用程序中,我会经常点击一个按钮,然后会发生很多事情,持续几分钟,然后它可能会闲置1小时,也可能只是1分钟。那么在这整个过程之后调用GC.Collect会是一个不错的选择吗?我的意思是,我知道此时我将不会使用我的应用程序,并且GC无法猜测。
好的,我读了一些相关主题,现在让我们来假设一个情况。假设我有一个应用程序,在这个应用程序中,我会经常点击一个按钮,然后会发生很多事情,持续几分钟,然后它可能会闲置1小时,也可能只是1分钟。那么在这整个过程之后调用GC.Collect会是一个不错的选择吗?我的意思是,我知道此时我将不会使用我的应用程序,并且GC无法猜测。
我看到有几个人过于推荐不要调用GC.Collect。
GC.Collect是有原因的,以下是我的建议,包括何时以及为什么要调用GC.Collect。
通常情况下,不必担心调用它,GC会自我调优并做出正确的事情。
有时候你会遇到确定需要调用它的情况,你所描述的情况正是调用它的恰当时机,实际上,Asp.Net在类似于你所描述的情况下会调用GC.Collect。
GC自己很聪明,如果你调用了GC.Collect,GC可以覆盖你的决策并且不会进行垃圾回收(当你调用GC.Collect时,你必须设置一个标志来选择此行为),这是调用GC.Collect的推荐方式,因为它仍然让GC决定是否是好时机进行回收。
不要认为我的建议适用于调用GC.Collect的一般情况,除非你确实确定需要调用它,否则应该始终避免调用它,像你所描述的那种情况正是GC.Collect存在的原因。
调用它的好处是快速释放垃圾,通常你会关心以下情况:
希望能对您有所帮助。
谢谢
几乎没有什么好的理由去调用 GC.Collect()
。
在你的情况下,绝对没有必要调用它。如果你闲置了一个小时,垃圾回收器会进行自己的垃圾回收。
我希望您知道调用GC.Collect不会导致更多(或更少)的对象被收集。
如果您想要优化时间,您是否知道GC在应用程序中收集对象所需的时间?在桌面操作系统(XP、Vista等)上,CLR使用并发GC,它可以在不暂停应用程序中的所有线程的情况下运行整个收集过程。
不建议显式调用GC.Collect,因为:
它会扰乱CLR GC调整算法。调整器会自动确定何时触发GC,强制手动GC会干扰其计算。
通过手动强制进行收集,您可能会使对象向上提升到较高的一代 - 这些对象如果在GC决定启动之前“孤立”可能已经被收集了。
您可能会发现有趣的是,在.NET 4.0中引入了GC通知机制,用于这些场景。
要知道何时调用GC.Collect()
,您需要了解与运行时相关的特定收集器的详细信息以及可以通过收集解决的弱点的详细信息。
换句话说,如果您真的知道何时需要调用GC.Collect()
,并且这不是您在其他代码中做得不好的事情,那么您可能正在为CLR Internals工作,并且可以修复问题。
GC.Collect()
及其底层技术的实现。例如,托管系统可能使用跨进程公共分配器,其中GC.Collect()
调用会冻结所有应用程序而不仅仅是一个。也许某个地方有一个可以调用GC.Collect()
的地方,但如果您知道那个地方,那么您可能不需要向我们询问任何问题。 :) - Sam Harwell通常只有在尝试分配新内存时才会调用 GC。如果您没有耗尽内存,调用 GC 将不会带来任何性能提升。您必须拥有一个非常资源密集型的应用程序,甚至才能接近今天计算机的 RAM 限制。
如果您的程序有大量外部资源(如文件或 COM/DCOM 引用),则可能需要调用 GC。
如果调用 GC 能让您心安,则请继续。这可能不会有所帮助,但肯定不会有害。