为什么未引用的对象不被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收集

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

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

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