为什么未引用的对象不被GC收集
本文关键字:GC 收集 对象 引用 为什么 | 更新日期: 2023-09-27 18:05:12
也许是我的问题,但我对这种(奇怪的)行为感到奇怪。
考虑下面的代码片段,这是演示效果的最小的Console程序。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收集?
注意:较大的控制台应用程序涉及一堆线程产生数据,和myclass类实例充当消费者。实例是通过WeakReference
引用的,但似乎这不是问题。问题是我不能通过在Main方法中运行我所有的测试生命周期来废弃一个消费者。
GC.Collect();不保证立即完成,它启动一个后台线程并立即返回,所以当分析器检查它时,它可能不会被收集。
GC.Collect()
异步运行。为了同步运行它,您需要调用:
GC.Collect();
GC.WaitForPendingFinalizers();