我有这个简单的代码:
sealed class GenObj
{
~GenObj()
{
Console.WriteLine("In Finalize method");
}
}
public static class Program
{
public static void Main()
{
Console.WriteLine("Maximum generations: " + GC.MaxGeneration);
Object o = new GenObj();
Console.WriteLine("Gen " + GC.GetGeneration(o)); // line 3
GC.Collect();
Console.WriteLine("Gen " + GC.GetGeneration(o)); // line 5
GC.Collect();
Console.WriteLine("Gen " + GC.GetGeneration(o)); // line 7
GC.Collect();
Console.WriteLine("Gen " + GC.GetGeneration(o));
}
}
输出 :
Maximum generations: 2
Gen 0
Gen 1
Gen 2
Gen 2
然而有一个问题。
这本书(c# via clr)也在开头说:
当 CLR 初始化时,它会选择所有三代的预算。如前所述,0 代的预算约为 256 KB,1 代的预算约为 2 MB。
…</p>
可能有多个垃圾收集,但只有在第 1 代达到其预算时才检查第 1 代中的对象,这通常需要第 0 代的几次垃圾收集。
问题 :
在第 4 行,我可以理解为什么它不在第 1 代中。(在 GC 之后从 0 移到 1)
我不明白的行是第 7 行。
根据书:the objects in generation 1 are examined only when generation 1 reaches its budget
我不认为它已经达到它的预算。所以我想它应该留在第一代!
根据这本书 - 它不应该转移到第 2 代。
我错过了什么?
ps这里是包含书中确切文本的链接(相信我我有PDF)