.NET GC中的所有三代都有终结队列,或者第二代只有它吗?我假设只有第2代有一个终结队列和与之关联的f-reachable队列。
答案 0 :(得分:5)
有一个队列。您可以使用SOS查看它:http://blogs.msdn.com/b/tess/archive/2007/10/19/net-finalizer-memory-leak-debugging-with-sos-dll-in-visual-studio.aspx
答案 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"); }
}