所有三个垃圾收集代都在.NET中有一个终结器队列吗?

时间:2012-02-15 03:12:06

标签: .net garbage-collection clr

.NET GC中的所有三代都有终结队列,或者第二代只有它吗?我假设只有第2代有一个终结队列和与之关联的f-reachable队列。

2 个答案:

答案 0 :(得分:5)

答案 1 :(得分:2)

这很难解释,实际的CLR代码与.NET文献中的描述不太匹配,而且非常复杂。 CLR中确实有一个逻辑结构,名称为“finalization_queue”。但是,它具有内部结构,可以通过生成来组织可终结的对象。

有一种更好的方式来展示这一点。如果你的假设是正确的,那么在第0代集合之后就无法完成一个对象。试试吧:

using System;

class Program {
    static void Main(string[] args) {
        var obj = new Test();
        obj = null;
        Console.WriteLine("before gen#0 collection");
        GC.Collect(0);
        GC.WaitForPendingFinalizers();
        Console.WriteLine("after gen#0 collection");
        Console.ReadLine();
    }
}

class Test {
    ~Test() { Console.WriteLine("finalized"); }
}