ほとんどの場合、ガベージ コレクターはコレクションを実行する最適なタイミングを判断できます。個別に実行できるようにする必要があります。 強制コレクションによってアプリケーションのパフォーマンスが向上する場合はまれです。 このような場合は、 GC.Collect メソッドを使用してガベージ コレクションを強制することで、ガベージ コレクションを誘発できます。
GC.Collect メソッドは、アプリケーションのコード内の特定の時点で使用されるメモリ量が大幅に減少する場合に使用します。 たとえば、アプリケーションで複数のコントロールを含む複雑なダイアログ ボックスを使用している場合、ダイアログ ボックスが閉じられたときに Collect を呼び出すと、ダイアログ ボックスで使用されるメモリをすぐに再利用することでパフォーマンスが向上する可能性があります。 ガベージ コレクターが最適でない時間にオブジェクトを再利用しようとするとパフォーマンスが低下する可能性があるため、アプリケーションでガベージ コレクションが頻繁に発生しないようにしてください。 次のセクションで説明するように、Collect メソッドにGCCollectionMode.Optimized列挙値を指定して収集できるのは、コレクションの生産性が高い場合のみです。
GC コレクション モード
GCCollectionMode値を含むGC.Collect メソッド オーバーロードのいずれかを使用して、強制コレクションの動作を次のように指定できます。
GCCollectionMode 価値 |
説明 |
---|---|
Default | 実行中のバージョンの .NET に既定のガベージ コレクション設定を使用します。 |
Forced | ガベージ コレクションが直ちに実行されます。 これは、 GC.Collect() オーバーロードを呼び出すことと同じです。 その結果、すべての世代の完全なブロック コレクションが生成されます。 また、 GCSettings.LargeObjectHeapCompactionMode プロパティを GCLargeObjectHeapCompactionMode.CompactOnce に設定して、すぐに完全にブロックするガベージ コレクションを強制することで、ラージ オブジェクト ヒープを圧縮することもできます。 |
Optimized | ガベージ コレクターが、現在の時刻がオブジェクトの再利用に最適かどうかを判断できるようにします。 ガベージ コレクターは、コレクションの生産性が十分でないと判断し、その場合はオブジェクトを再利用せずに戻ります。 |
バックグラウンドコレクションまたはブロックコレクション
GC.Collect(Int32, GCCollectionMode, Boolean) メソッドオーバーロードを呼び出して、誘発されたコレクションがブロックされているかどうかを指定できます。 実行されるコレクションの種類は、メソッドの mode
パラメーターと blocking
パラメーターの組み合わせによって異なります。
mode
は GCCollectionMode 列挙体のメンバーであり、 blocking
は Boolean 値です。 次の表は、 mode
引数と blocking
引数の相互作用をまとめたものです。
mode |
blocking = true |
blocking = false |
---|---|---|
Forced または Default | ブロッキング コレクションは、できるだけ早く実行されます。 バックグラウンド コレクションが進行中で、生成が 0 または 1 の場合、 Collect(Int32, GCCollectionMode, Boolean) メソッドはすぐにブロッキング コレクションをトリガーし、コレクションの終了時に戻ります。 バックグラウンド コレクションが進行中で、 generation パラメーターが 2 の場合、メソッドはバックグラウンド コレクションが完了するまで待機し、ブロックジェネレーション 2 のコレクションをトリガーしてから、戻ります。 |
コレクションはできるだけ早く実行されます。 Collect(Int32, GCCollectionMode, Boolean) メソッドはバックグラウンド コレクションを要求しますが、これは保証されません。状況によっては、ブロック コレクションが引き続き実行される可能性があります。 バックグラウンド コレクションが既に進行中の場合、メソッドはすぐに返されます。 |
Optimized | ガベージ コレクターと generation パラメーターの状態によっては、ブロッキング コレクションを実行できます。 ガベージ コレクターは、最適なパフォーマンスを提供しようとします。 |
ガベージ コレクターの状態によっては、コレクションを実行できます。 Collect(Int32, GCCollectionMode, Boolean) メソッドはバックグラウンド コレクションを要求しますが、これは保証されません。状況によっては、ブロック コレクションが引き続き実行される可能性があります。 ガベージ コレクターは、最適なパフォーマンスを提供しようとします。 バックグラウンド コレクションが既に進行中の場合、メソッドはすぐに返されます。 |
こちらも参照ください
.NET