Share via


発生したコレクション

ほとんどの場合、コレクションの実行に最適なタイミングはガベージ コレクターが判断できるので、ガベージ コレクターに任せるのが良い方法です。 ただし、ごくまれに、強制的にコレクションを実行するとアプリケーションのパフォーマンスが向上する場合があります。 このような場合は、GC.Collect メソッドを使用してガベージ コレクションを強制的に実行できます。

アプリケーションのコードの特定の位置で、使用しているメモリ量が大きく減少する場合は、GC.Collect メソッドを使用します。 たとえば、複数のコントロールのある複雑なダイアログ ボックスを使用するアプリケーションでは、ダイアログ ボックスを閉じるときに Collect を呼び出すと、ダイアログ ボックスの使用メモリが直ちに再利用されてパフォーマンスが向上する可能性があります。 適切でない回数でガベージ コレクターがオブジェクトの再利用を試みるとパフォーマンスが低下する場合があるので、アプリケーションではあまり頻繁にガベージ コレクションを強制しないでください。 次のセクションで説明するように、コレクションの効果がある場合にのみ、GCCollectionMode.Optimized のメソッドに対して収集する Collect の列挙値を指定できます。

GC コレクション モード

GC.Collect 値を含む GCCollectionMode メソッド オーバーロードの 1 つを使用して、強制的コレクションの動作を次のように指定できます。

GCCollectionMode 説明
Default 実行中のバージョンの .NET の既定のガベージ コレクション設定を使用します。
Forced 直ちにガベージ コレクションを強制的に実行します。 これは、GC.Collect() オーバーロードを呼び出すのと同じです。 結果として、すべてのジェネレーションのフル ブロッキング コレクションになります。

また、直ちにフル ブロッキング ガベージ コレクションを強制的に実行する前に、GCSettings.LargeObjectHeapCompactionMode プロパティを GCLargeObjectHeapCompactionMode.CompactOnce に設定して、大きなオブジェクト ヒープを圧縮することもできます。
Optimized オブジェクトを再利用するのに現在が最適なときかどうかをガベージ コレクターが判断できるようにします。

ガベージ コレクターは、コレクションの実行を正当化できるほど効果がないと判断して、オブジェクトを再利用せずに戻る場合があります。

バックグラウンドまたはブロッキング コレクション

GC.Collect(Int32, GCCollectionMode, Boolean) メソッド オーバーロードを呼び出して、発生するコレクションがブロッキング コレクションであるかどうかを指定できます。 実行されるコレクションの型は、メソッドの modeblocking のパラメーターの組み合わせによって異なります。 modeGCCollectionMode 列挙体のメンバーです。blockingBoolean 値です。 modeblocking 引数の相互作用を次の表にまとめます。

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) メソッドはバックグラウンド コレクションを要求しますが、それは保証されず、状況によってはブロッキング コレクションが実行される場合もあります。 ガベージ コレクターは最適なパフォーマンスを提供しようとします。 バックグラウンド コレクションが既に実行中の場合、メソッドはすぐに制御を返します。

関連項目