0

私はこの簡単なコードを持っています:

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を持っていると信じています)があるリンクがあります

4

4 に答える 4

1

本で読んだことすべてを信じないでください。

著者が本を書いたとき、彼/彼女はトピックを完全に理解していないかもしれません。著者が本を書いた後、実装が変更された可能性があります。

ここに私の理解があります:

初期 GC バジェットは、GC モードとマシン構成によって決まります。

通常、小さいオブジェクトは gen0 領域に割り当てられ、gen1 領域に移動され、次に gen2 領域に移動されます。大きなオブジェクトは、gen2 と見なされる大きなオブジェクト ヒープに割り当てられます。

于 2014-09-14T15:10:27.267 に答える
1

私はダミアンが正しいと信じています。この本では、完全なガベージ コレクションを強制しないとどうなるかについて説明しています。しかし、あなたはそれをします。したがって、正しいテキストは次のようになります。

複数のコレクションがあった可能性がありますが、ジェネレーション 1 のオブジェクトは、ジェネレーション 1 GC が発生したときにのみ調べられます。また、ジェネレーション 1 の GC は、ジェネレーション 1 がその予算に達したときに発生します。これには、通常、ジェネレーション 0 のガベージ コレクションが数回必要ですが、 を呼び出して強制することもできますGC.Collect(1)

于 2012-04-08T11:24:01.427 に答える