私はこの簡単なコードを持っています:
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 が初期化されると、3 つの世代すべての予算が選択されます。前述したように、ジェネレーション 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
すでに予算に達しているとは思えません。だから私はそれが第1世代にとどまるべきだと思います!!!
本によると - ジェネレーション 2 に移行するべきではありませんでした。
私は何が欠けていますか?
psここに、本からの正確なテキスト(私がPDFを持っていると信じています)があるリンクがあります