也许是我,但我想知道这种(奇怪的)行为。
考虑下面的代码片段,这是用于说明效果的最小控制台程序。
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方法中运行我的所有测试生命周期来废弃消费者。
提前致谢。
答案 0 :(得分:1)
GC.Collect的();不能保证立即完成,它会启动一个后台线程并立即返回,以便当时的分析器检查它,它可能不会被收集。
答案 1 :(得分:1)
GC.Collect()
以异步方式运行。 In order to run it synchronously您需要致电:
GC.Collect();
GC.WaitForPendingFinalizers();