GC.Collect循环?

时间:2009-03-17 10:51:48

标签: c# .net garbage-collection

我使用Reflector

在System.Web.ISAPIRuntime中找到了这段代码
public void DoGCCollect()
{
    for (int i = 10; i > 0; i--)
    {
        GC.Collect();
    }
}

有人可以对此发表评论吗?是否有理由在循环中执行GC.Collect()?为什么10次而不是3次,5次或20次?分析表明它没有在.net框架内部使用,但它是公共的,所以我想IIS可以调用它...

编辑

仅为澄清目的:我从未打电话给GC.Collect,我无意使用它。我知道在大多数(如果不是全部)案例中这是一个坏主意。问题是.net框架为什么会这样做。谢谢你的所有答案。

8 个答案:

答案 0 :(得分:14)

是的,那太可怕了。首先,你根本不需要这样做。但是,如果你真的想尽可能地强制垃圾收集,并等待它完成,你应该使用:

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
// Collect anything that's just been finalized
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

虽然真的不是一个好主意。

答案 1 :(得分:7)

看起来真的太可怕了:))

答案 2 :(得分:5)

我认为你不会得到一个更好的解释,“微软的程序员之一是非常无能为力的,显然,在签入之前没有其他人费心去查看他的代码”。 ;)

虽然看起来确实很吓人。

这是对您不理解的错误的相当常见的回应。无论出于何种原因,你试图调用GC,不知怎的,调用它似乎并没有解决你的问题(也许真正的问题只是你应该等待终结器线程或其他东西),所以天真的解决方案是显然“嗯,我会继续称它为”。

类似于在打印文档之前反复按“打印”。

也许您应该将它提交给thedailywtf.com。

答案 3 :(得分:2)

我非常喜欢这种方法的Mono实现:

public void DoGCCollect ()
{
  // Do nothing.
}

可能开发人员打算写类似的东西,这只是一个错字。

答案 4 :(得分:1)

看起来有一个世界末日情结的人写下了它的内涵,他们将以10秒计时器结束这个世界......

答案 5 :(得分:1)

不应该向微软指出这样的事情吗?将此发布在Connect网站上会有什么好处吗?

答案 6 :(得分:0)

这不是一个好主意,因为你真的应该相信垃圾收集器能够完成它的工作,而不是专门从你的代码中调用它。

99.9%的时间您从不需要从代码中调用GC。

答案 7 :(得分:0)

首先,调用GC.Collect()不是一个好主意。多次调用几乎没有效果。

但是,您有时会看到调用Collect(),然后调用WaitForPendingFinalizers(),然后再调用Collect()的模式。这背后的想法是确保带有终结器的实例也被回收,因为它们将在第一次收集后存活下来。请记住,这会导致应用程序出现延迟,并且很少需要。