System.GC クラス

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

クラスは GC ガベージ コレクターを制御します。 ガベージ コレクターは、マネージド メモリの割り当てと解放を制御する共通言語ランタイム コンポーネントです。 このクラスのメソッドは、オブジェクトに対してガベージ コレクションが実行されたとき、およびオブジェクトによって割り当てられたリソースが解放されるときに影響します。 このクラスのプロパティは、システムで使用可能なメモリの合計量と、オブジェクトに割り当てられたメモリの有効期間カテゴリ (世代) に関する情報を提供します。

ガベージ コレクターは、マネージド メモリに割り当てられたオブジェクトを追跡して回収します。 ガベージ コレクターは定期的にガベージ コレクションを実行して、有効な参照がないオブジェクトに割り当てられたメモリを再利用します。 ガベージ コレクションは、使用可能な空きメモリを使用してメモリの要求を満たすことができない場合に自動的に発生します。 または、アプリケーションでメソッドを使用してガベージ コレクションを Collect 強制することもできます。

ガベージ コレクションは、次の手順で構成されます。

  1. ガベージ コレクターは、マネージド コードで参照されているマネージド オブジェクトを検索します。
  2. ガベージ コレクターは、参照されていないオブジェクトの最終処理を試みます。
  3. ガベージ コレクターは、参照されていないオブジェクトを解放し、メモリを再利用します。

アンマネージ リソース

コレクション中、ガベージ コレクターは、マネージド コードでオブジェクトへの 1 つ以上の参照を見つけた場合、オブジェクトを解放しません。 ただし、ガベージ コレクターはアンマネージ コードからオブジェクトへの参照を認識せず、明示的に禁止されていない限り、アンマネージ コード内で排他的に使用されているオブジェクトを解放する可能性があります。 このメソッドは KeepAlive 、アンマネージ コードでまだ使用されているオブジェクトをガベージ コレクターが収集できないようにするメカニズムを提供します。

マネージド メモリの割り当て以外に、ガベージ コレクターの実装では、ファイル ハンドルやデータベース接続など、オブジェクトによって保持されているリソースに関する情報はメインされません。 型のインスタンスが再利用される前に解放する必要があるアンマネージ リソースが型で使用されている場合、型はファイナライザーを実装できます。

ほとんどの場合、ファイナライザーはメソッドを Object.Finalize オーバーライドすることによって実装されます。ただし、C# または C++ で記述された型はデストラクターを実装し、コンパイラ Object.Finalizeは . ほとんどの場合、オブジェクトにファイナライザーがある場合、ガベージ コレクターはオブジェクトを解放する前に呼び出します。 ただし、ガベージ コレクターは、すべての状況でファイナライザーを呼び出す必要はありません。たとえば、このメソッドは SuppressFinalize 、オブジェクトのファイナライザーが呼び出されないように明示的に禁止します。 また、ガベージ コレクターは、オブジェクトを最終処理するために特定のスレッドを使用したり、相互に参照しているがガベージ コレクションで使用できるオブジェクトに対してファイナライザーが呼び出される順序を保証したりする必要はありません。

リソースを特定の時刻に解放する必要があるシナリオでは、クラスはインターフェイスをIDisposable実装できます。このインターフェイスには、リソース管理タスクとクリーンアップ タスクを実行するメソッドが含まれていますIDisposable.Dispose。 実装Disposeするクラスは、クラス コントラクトの一部として、クラス コンシューマーがメソッドを呼び出してオブジェクトをクリーンする場合に指定する必要があります。 ガベージ コレクターは、既定ではメソッドを Dispose 呼び出しません。ただし、メソッドの実装では、クラス内の Dispose メソッドを GC 呼び出してガベージ コレクターの終了動作をカスタマイズできます。

オブジェクトの最終処理と破棄パターンの詳細については、「アンマネージ リソースのクリーンアップ」を参照してください

物体の老化と世代

共通言語ランタイムのガベージ コレクターは、世代を使用したオブジェクトのエイジングをサポートします。 生成は、メモリ内のオブジェクトの相対的な経過時間の単位です。 オブジェクトの世代番号 (age) は、オブジェクトが属する世代を示します。 最近作成されたオブジェクトは、新しい世代の一部であり、アプリケーションのライフ サイクルで以前に作成されたオブジェクトよりも世代番号が小さくなります。 最新の世代のオブジェクトは、ジェネレーション 0 にあります。 ガベージ コレクターのこの実装では、ジェネレーション 0、1、2 の 3 世代のオブジェクトがサポートされます。 プロパティの値を MaxGeneration 取得して、システムでサポートされている最大世代数を決定できます。

オブジェクト のエージングにより、アプリケーションは、ガベージ コレクターにすべての世代を評価する必要はなく、特定の世代のセットでガベージ コレクションを対象とすることができます。 パラメーターを含むメソッドの Collect オーバーロードを使用すると、 generation ガベージ コレクションする最も古い世代を指定できます。

ガベージ コレクションの禁止

ガベージ コレクターは、ガベージ コレクションがアプリのパフォーマンスに悪影響を与える可能性があるクリティカル パスの実行中に使用できる GC リージョン待機時間モードをサポートしません。 GC 領域待機時間モードを使用しない場合、ガベージ コレクターからの干渉なしに割り当てることができるメモリの量を指定する必要があります。 ランタイムがそのメモリを割り当てることができる場合、ランタイムはクリティカル パス内のコードの実行中にガベージ コレクションを実行しません。

のオーバーロードのいずれかを呼び出して、NO GC 領域のクリティカル パスの TryStartNoGCRegion先頭を定義します。 メソッドを呼び出して、クリティカル パスの末尾を EndNoGCRegion 指定します。

メソッドの呼び出しを TryStartNoGCRegion 入れ子にすることはできません。ランタイムが現在 GC リージョン待機時間モードでない場合にのみ、メソッドを呼び出 EndNoGCRegion す必要があります。 つまり、複数回呼び出さないでください (最初のメソッド呼び出TryStartNoGCRegionしの後、後続の呼び出しは成功しません)。また、最初の呼び出しが成功したからといって呼び出しEndNoGCRegionTryStartNoGCRegionが成功することは想定しないでください。