3

実行することをお勧めする複数のアンサーを見てきましたGC.Collect(GC.MaxGeneration)
メソッドGC.Collect()は既存のすべての世代を収集するため、2 つの違いはありますか?

おそらく、生きている世代が 3 つではなく 2 つしかない場合、GC は 2 つの世代を収集し、3 つ目の世代を収集しようとしないため、パフォーマンスが向上します。しかし、真剣に、これは理にかなっていますか?

4

5 に答える 5

0

GC.Collect()を使用GCCollectionMode.Defaultし、GC.Collect(GC.MaxGeneration)

だから、その時の間に違いはありません!


MSDNによると

GCCollectionMode列挙型

Default : この列挙型の既定の設定で、現在は Forced です。
Forced : ガベージ コレクションをすぐに実行するように強制します。
Optimized : ガベージ コレクターが、現在の時間がオブジェクトの再利用に最適かどうかを判断できるようにします。

リフレクターの使用:

[MethodImpl(MethodImplOptions.InternalCall)]
private static void nativeCollectGeneration(int generation, int mode); 

public static void Collect()
{
  GC.nativeCollectGeneration(-1, 0);
}

public static void Collect(int generation)
{
  GC.Collect(generation, GCCollectionMode.Default);
}

PS :0GCCollectionMode.Defaultは同じです。

于 2013-04-08T10:40:29.907 に答える
0

標準の (システムによって開始される) ガベージ コレクションの動作は次のとおりです。

  1. ルート化されていない (つまり、アクティブなコードから参照されている) GenX からすべての項目を削除します。
  2. 残りのすべてのアイテムを GenX から GenX+1 に昇格
  3. GenX+1 に新しいアイテム用の十分なスペースがない場合は、GenX+1 について上記を繰り返します。

そのため、標準コレクションは Gen0 のみを収集し、一部のデータを Gen1 にシャッフルしてから停止する場合があります。これは、Gen2 に到達するオブジェクトの長寿命に貢献します。Gen2 は Gen0 よりもはるかに少ない頻度で収集されるため、Gen2 に到達するオブジェクトはしばらくの間ぶらぶらする可能性があります。

すべての世代のコレクションを強制すると、Gen2 のオブジェクトがすぐに収集されます。これにより、より多くのメモリが解放されますが、パフォーマンスにも影響します。

最も重要なことは、どのコレクションもルート化されたアイテムを次世代に昇格させることです。これが、手動コレクションが良くない理由の 1 つです。アイテムは不必要に Gen1/2 に昇格され、実際には長く残ります (問題を悪化させる手動 GC を繰り返し使用しない限り...)。

于 2013-04-08T10:51:50.167 に答える
-1

これがGCクラスの内部コードです

// Forces a collection of all generations from 0 through Generation.
//
public static void Collect(int generation) {
    Collect(generation, GCCollectionMode.Default);
    }

// Garbage Collect all generations.
//
[System.Security.SecuritySafeCritical]  // auto-generated
public static void Collect() {
    //-1 says to GC all generations.
    _Collect(-1, (int)GCCollectionMode.Default);
}

[System.Security.SecuritySafeCritical]  // auto-generated
public static void Collect(int generation, GCCollectionMode mode)
{
    if (generation<0)
    {
        throw new ArgumentOutOfRangeException("generation", Environment.GetResourceString("ArgumentOutOfRange_GenericPositive"));
    }
    if ((mode < GCCollectionMode.Default) || (mode > GCCollectionMode.Optimized))
    {
        throw new ArgumentOutOfRangeException(Environment.GetResourceString("ArgumentOutOfRange_Enum"));
    }
    Contract.EndContractBlock();
    _Collect(generation, (int)mode);
}

ここで、両方のメソッド呼び出しが 2 つのパラメーターで Collect メソッドを呼び出していることがわかります。収集 (int 世代、GCCollectionMode モード)。

于 2013-04-08T10:55:45.713 に答える