バックグラウンド ガベージ コレクション

バックグラウンド ガベージ コレクション (GC) では、ジェネレーション 2 のコレクションの実行中に、必要に応じて短期ジェネレーション (0 および 1) のコレクションが行われます。 バックグラウンド ガベージ コレクションは、ワークステーション GC かサーバー GC かによって 1 つまたは複数の専用スレッドで実行され、ジェネレーション 2 のコレクションにのみ適用されます。

バックグラウンド ガベージ コレクションは既定で有効になっています。 これは、.NET Framework アプリの gcConcurrent 構成設定または .NET Core と .NET 5 以降のアプリの System.GC.Concurrent 設定で有効または無効にすることができます。

注意

バックグラウンド ガベージ コレクションは同時実行ガベージ コレクションに取って代わり、.NET Framework 4 以降で利用できます。 .NET Framework 4 では、"ワークステーション" ガベージ コレクションのみでサポートされます。 .NET Framework 4.5 以降では、バックグラウンド ガベージ コレクションは、"ワークステーション" と "サーバー" の両方のガベージ コレクションで使用できます。

バックグラウンド ガベージ コレクションの実行中に行われる短期ジェネレーションに対するコレクションのことを、"フォアグラウンド" ガベージ コレクションと呼びます。 フォアグラウンド ガベージ コレクションが発生すると、マネージド スレッドはすべて中断されます。

バックグラウンド ガベージ コレクションの実行中にジェネレーション 0 に十分なオブジェクトが割り当てられていれば、CLR はジェネレーション 0 またはジェネレーション 1 のフォアグラウンド ガベージ コレクションを実行します。 バックグラウンド ガベージ コレクションの専用スレッドは、フォアグラウンド ガベージ コレクションの要求がないかどうかをセーフ ポイントで頻繁に確認します。 要求があると、バックグラウンド コレクションを中断して、フォアグラウンド ガベージ コレクションを実行します。 フォアグラウンド ガベージ コレクションが完了すると、バックグラウンド ガベージ コレクションの専用スレッドとユーザー スレッドが再開されます。

バックグラウンド ガベージ コレクションでは、バックグラウンド ガベージ コレクションの実行中に短期ガベージ コレクションが発生する可能性があるため、同時実行ガベージ コレクションによる割り当ての制限が解除されます。 バックグラウンド ガベージ コレクションでは、短期ジェネレーションの使用されなくなったオブジェクトを削除できます。 ジェネレーション 1 ガベージ コレクション中に必要になった場合、ヒープを拡張することもできます。

バックグラウンドのワークステーションとサーバーの GC

.NET Framework 4.5 以降では、バックグラウンド ガベージ コレクションは、サーバー GC で使用できます。 バックグラウンド GC は、サーバー ガベージ コレクションの既定のモードです。

サーバーのバックグラウンド ガベージ コレクションは、ワークステーションのバックグラウンド ガベージ コレクションと同様に機能しますが、いくつかの違いがあります。

  • ワークステーションのバックグラウンド ガベージ コレクションでは専用のバックグラウンド ガベージ コレクション スレッドを 1 つ使用します。これに対して、サーバーのバックグラウンド ガベージ コレクションでは複数のスレッドを使用します。 通常、論理プロセッサごとに専用のスレッドが使用されます。

  • ワークステーションのバックグラウンド ガベージ コレクション スレッドとは異なり、サーバーのバックグラウンド GC スレッドはタイムアウトになりません。

次の図は、別々の専用スレッドで実行される "ワークステーション" のバックグラウンド ガベージ コレクションを示しています。

Background workstation garbage collection

次の図は、別々の専用スレッドで実行される "サーバー" のバックグラウンド ガベージ コレクションを示しています。

Background server garbage collection

同時実行ガベージ コレクション

ヒント

このセクションは次に適用されます。

  • ワークステーション ガベージ コレクションの .NET Framework 3.5 以前
  • サーバー ガベージ コレクションの .NET Framework 4 以前

後のバージョンでは、バックグラウンド ガベージ コレクションが同時実行ガベージに取って代わります。

ワークステーションまたはサーバーのガベージ コレクションでは、同時実行ガベージ コレクションを有効にすることで、複数のスレッドを同時に実行できます。同時実行ガベージ コレクションでは、コレクションの実行中は、ほとんどの場合、ガベージ コレクションの処理を行う専用のスレッドが使用されます。 このオプションは、ジェネレーション 2 のガベージ コレクションにのみ影響します。ジェネレーション 0 と 1 の処理はすぐに終了するため、常に非同時実行で行われます。

同時実行ガベージ コレクションでは、コレクションの一時停止を最小限にすることで、インタラクティブ アプリケーションの応答性を高めることができます。 マネージド スレッドは、同時実行ガベージ コレクションのスレッドが実行されている間も、ほぼ常に処理を続けることができます。 このデザインでは、ガベージ コレクションを実行している間は一時停止が短くなります。

同時実行ガベージ コレクションは、専用のスレッドで実行されます。 既定では、CLR は、シングルプロセッサとマルチプロセッサの両方のコンピューターで、同時実行ガベージ コレクションを有効にして、ワークステーションのガベージ コレクションを実行します。

次の図は、別々の専用のスレッドで実行される同時実行ガベージ コレクションを示しています。

Concurrent Garbage Collection Threads

関連項目