3

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

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

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()没有帮助,也没有将程序作为“Release”运行。

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

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

提前致谢。

4

2 回答 2

1

GC.Collect()异步运行。为了同步运行它,您需要调用:

GC.Collect();
GC.WaitForPendingFinalizers();
于 2013-03-22T11:29:47.660 回答
1

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

于 2013-03-22T11:28:31.633 回答