为什么GC没有收集未引用的对象?

时间:2013-03-22 11:24:46

标签: c# garbage-collection

也许是我,但我想知道这种(奇怪的)行为。

考虑下面的代码片段,这是用于说明效果的最小控制台程序。

class MyClass { }

class Program
{
    static void Main(string[] args)
    {
            var x = new MyClass();
            var y = new MyClass();

            x = null;
            GC.Collect();

            Console.ReadKey();
    }
}

当程序暂停按键时(或通过放置断点),内存分析器显示仍有两个“MyClass”实例被引用。

GC.Collect()没有帮助,也没有将程序作为“发布”运行。

不应该尽快收集未引用的MyClass实例,至少通过强制GC收集?

注意:较大的Console应用程序涉及一堆产生数据的线程,而类似MyClass的实例充当消费者。实例通过WeakReference引用,但似乎不是问题。问题是我无法通过在Main方法中运行我的所有测试生命周期来废弃消费者。

提前致谢。

2 个答案:

答案 0 :(得分:1)

GC.Collect的();不能保证立即完成,它会启动一个后台线程并立即返回,以便当时的分析器检查它,它可能不会被收集。

答案 1 :(得分:1)

GC.Collect()以异步方式运行。 In order to run it synchronously您需要致电:

GC.Collect();
GC.WaitForPendingFinalizers();