実行することをお勧めする複数のアンサーを見てきましたGC.Collect(GC.MaxGeneration)
。
メソッドGC.Collect()
は既存のすべての世代を収集するため、2 つの違いはありますか?
おそらく、生きている世代が 3 つではなく 2 つしかない場合、GC は 2 つの世代を収集し、3 つ目の世代を収集しようとしないため、パフォーマンスが向上します。しかし、真剣に、これは理にかなっていますか?
実行することをお勧めする複数のアンサーを見てきましたGC.Collect(GC.MaxGeneration)
。
メソッドGC.Collect()
は既存のすべての世代を収集するため、2 つの違いはありますか?
おそらく、生きている世代が 3 つではなく 2 つしかない場合、GC は 2 つの世代を収集し、3 つ目の世代を収集しようとしないため、パフォーマンスが向上します。しかし、真剣に、これは理にかなっていますか?
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 :0
とGCCollectionMode.Default
は同じです。
標準の (システムによって開始される) ガベージ コレクションの動作は次のとおりです。
そのため、標準コレクションは Gen0 のみを収集し、一部のデータを Gen1 にシャッフルしてから停止する場合があります。これは、Gen2 に到達するオブジェクトの長寿命に貢献します。Gen2 は Gen0 よりもはるかに少ない頻度で収集されるため、Gen2 に到達するオブジェクトはしばらくの間ぶらぶらする可能性があります。
すべての世代のコレクションを強制すると、Gen2 のオブジェクトがすぐに収集されます。これにより、より多くのメモリが解放されますが、パフォーマンスにも影響します。
最も重要なことは、どのコレクションもルート化されたアイテムを次世代に昇格させることです。これが、手動コレクションが良くない理由の 1 つです。アイテムは不必要に Gen1/2 に昇格され、実際には長く残ります (問題を悪化させる手動 GC を繰り返し使用しない限り...)。
これが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 モード)。