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

所有三代垃圾收集在.NET中都有终结器队列吗?,.net,garbage-collection,clr,.net,Garbage Collection,Clr,NET GC中的所有三代都有终结器队列,还是第2代只有终结器队列?我假设只有第2代具有终结器队列和与其相关联的f可达队列 有一个队列。您可以使用SOS查看它:这很难解释,实际的CLR代码与.NET文献中的描述不太匹配,而且非常复杂。CLR内部确实有一个名为“finalization_queue”的逻辑结构。但是,它具有内部结构,可以按生成方式组织可终结对象 有一个更好的方式来展示这一点。如果您的假设是正确的,那么在gen#0集合之后就不可能最终确定对象。试试看: using System; c

NET GC中的所有三代都有终结器队列,还是第2代只有终结器队列?我假设只有第2代具有终结器队列和与其相关联的f可达队列

有一个队列。您可以使用SOS查看它:

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

有一个更好的方式来展示这一点。如果您的假设是正确的,那么在gen#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"); }
}

仅供参考,这个问题与C无关#如果您满意,请接受其中任何一个答案。您有兴趣知道,内存是否升级到第2代,然后升级到fininalizer队列,然后收集(或)第0代有一个队列和收集感谢这篇文章非常有帮助。它向我介绍了sos.dll,它允许我在没有分析器的情况下检查内存问题。再次感谢。