我有這個簡單的代碼:CLR GC的世代預算?
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
但是有一個問題。
書(CLR通過C#)也說開頭:
當CLR初始化時,它爲所有三個 代選擇的預算。正如我前面提到的,第0代的預算是 約256 KB,第1代的預算約爲2 MB。
...
也許已經有幾個集合,但在 1代的對象僅進行檢查時,第1代達到其預算, 這通常需要一代0
的幾個垃圾收集問題:
在#4線我可以理解爲什麼它不在第1代(GC後從0移到1)
我不明白的是第7行。
根據這本書:the objects in generation 1 are examined only when generation 1 reaches its budget
我不認爲它已經達到了它的預算。所以我想它應該留在第一代!
根據這本書 - 它不應該轉移到第二代。
我在想什麼?
p.s.這裏是link其中有確切的文字(相信我我有PDF)從書
我無法訪問本書,但可能是在討論用於決定是進行部分集合還是完整集合的啓發式方法 - 並且每次都強制執行完整集合。 – 2012-04-08 07:31:31
@Damien_The_Unbeliever在我的回答中已經完成了 – 2012-04-08 17:46:49