ガベージ コレクターは自己チューニングであり、さまざまなシナリオで動作します。 ただし、ワークロードの特性に基づいて ガベージ コレクションの種類を設定 できます。 CLR には、次の種類のガベージ コレクションが用意されています。
クライアント アプリ用に設計されたワークステーション ガベージ コレクション (GC)。 スタンドアロン アプリの既定の GC フレーバーです。 ホストされているアプリ (たとえば、ASP.NET によってホストされているアプリ) の場合、ホストは既定の GC フレーバーを決定します。
ワークステーションのガベージ コレクションは、同時実行または非同時実行にすることができます。 同時実行 (または バックグラウンド) ガベージ コレクションを使用すると、マネージド スレッドはガベージ コレクション中に操作を続行できます。 バックグラウンド ガベージ コレクション は、.NET Framework 4 以降のバージョンの 同時実行ガベージ コレクション を置き換えます。
高いスループットとスケーラビリティを必要とするサーバー アプリケーションを対象としたサーバー ガベージ コレクション。
.NET Core では、サーバー ガベージ コレクションは非同時実行またはバックグラウンドにすることができます。
.NET Framework 4.5 以降のバージョンでは、サーバー ガベージ コレクションは非同時実行またはバックグラウンドにすることができます。 .NET Framework 4 以前のバージョンでは、サーバー ガベージ コレクションは非同時実行です。
次の図は、サーバーでガベージ コレクションを実行する専用スレッドを示しています。
パフォーマンスに関する考慮事項
ワークステーションの GC
ワークステーションのガベージ コレクションのスレッド処理とパフォーマンスに関する考慮事項を次に示します。
コレクションは、ガベージ コレクションをトリガーしたユーザー スレッドで発生し、同じ優先度のままです。 通常、ユーザー スレッドは通常の優先順位で実行されるため、ガベージ コレクター (通常の優先度のスレッドで実行) は、CPU 時間のために他のスレッドと競合する必要があります。 (ネイティブ コードを実行するスレッドは、サーバーまたはワークステーションのガベージ コレクションで中断されません)。
ワークステーション ガベージ コレクションは、 構成設定に関係なく、論理 CPU が 1 つしかないコンピューターで常に使用されます。
サーバーの GC
サーバー ガベージ コレクションのスレッド処理とパフォーマンスに関する考慮事項を次に示します。
コレクションは、複数の専用スレッドで発生します。 Windows では、これらのスレッドは優先度レベル
THREAD_PRIORITY_HIGHEST
実行されます。論理 CPU ごとにヒープとガベージ コレクションを実行する専用スレッドが提供され、ヒープが同時に収集されます。 各ヒープには小さなオブジェクト ヒープと大きなオブジェクト ヒープが含まれており、すべてのヒープにユーザー コードからアクセスできます。 異なるヒープ上のオブジェクトは相互に参照できます。
複数のガベージ コレクション スレッドが連携するため、サーバー ガベージ コレクションは、同じサイズのヒープ上のワークステーション ガベージ コレクションよりも高速です。
多くの場合、サーバー ガベージ コレクションには大きなサイズのセグメントがあります。 ただし、これは一般化にすぎません。セグメント サイズは実装固有であり、変更される可能性があります。 アプリのチューニング時にガベージ コレクターによって割り当てられるセグメントのサイズについては、想定しないでください。
サーバー ガベージ コレクションは、リソースを大量に消費する可能性があります。 たとえば、4 つの論理 CPU を持つコンピューターで実行されているサーバー GC を使用するプロセスが 12 つあるとします。 すべてのプロセスが同時にガベージ を収集する場合、同じ論理 CPU に 12 個のスレッドがスケジュールされるため、相互に干渉します。 プロセスがアクティブな場合は、すべてのプロセスにサーバー GC を使用させるのは良い考えではありません。
アプリケーションの数百のインスタンスを実行している場合は、同時実行ガベージ コレクションを無効にしたワークステーション ガベージ コレクションの使用を検討してください。 これにより、コンテキストの切り替えが少なくなり、パフォーマンスが向上する可能性があります。
こちらも参照ください
.NET