Share via


待機モード

オブジェクトを解放するには、ガベージ コレクターが、アプリケーションで実行しているすべてのスレッドを停止する必要があります。 アプリケーションがデータの取得やコンテンツの表示を行うときなど、状況によっては、重要な局面でフル ガベージ コレクションが発生し、パフォーマンスに影響を及ぼすことがあります。 GCSettings.LatencyMode プロパティを System.Runtime.GCLatencyMode 値のいずれかに設定すると、ガベージ コレクションの割り込みの動作を調整できます。

"待機" とは、ガベージ コレクターがアプリケーションに関与する時間を指します。 待機時間が短い場合、オブジェクトの解放において、ガベージ コレクターは慎重かつ控えめに動作します。 GCLatencyMode.LowLatency モードは、必要な場合に短い時間に限って使用することをお勧めします。 そうしないと、システムがメモリ圧迫の状態にある場合にガベージ コレクターがコレクションを実行し、アプリケーションの停止や、処理速度が重要視される操作の中断が一時的に発生する状況を生み出します。

待機時間が短い場合、次の状況を除いて、ジェネレーション 2 のコレクションは抑制されます。

  • オペレーティング システムからメモリ不足の通知を受け取る。

  • GC.Collect メソッドを呼び出し、generation パラメーターに 2 を指定することでコレクションが実行される。

待機モードは、短時間に実行するコード ブロックを含むアプリケーションで使用し、実行するときはランタイムからの中断を最小限に抑えることが必要です。 LowLatency モードは時間的な制約のあるシナリオで使用するように設計されていますが、厳密なリアルタイム制約のあるシナリオを解決することを意図したものではありません。

GCLatencyMode 値に適したアプリケーション シナリオを次の表に示します。

待機モード

アプリケーション シナリオ

Batch

UI の操作やサーバー側の操作がないアプリケーションに適しています。

Interactive

UI のあるほとんどのアプリケーションに適しています。

LowLatency

ガベージ コレクターによる中断の影響を受ける可能性がある場合、短時間に実行されることが重要なアプリケーションに適しています。 たとえば、アニメーションのレンダリングやデータの取得を行うアプリケーションなどが該当します。

ガベージ コレクションの既定のモード

LatencyMode プロパティが指定されていない場合は、ワークステーション上で同時実行されるガベージ コレクションが既定のモードになります。 このモードは、次に挙げる 2 つのランタイム構成設定の値に依存します。

  • <gcConcurrent>

    有効な場合、共通言語ランタイムは別のスレッドでワークステーションのガベージ コレクションを実行し、同時実行操作をサポートします。 この設定は既定で有効になっています。

  • <gcServer>

    有効な場合、共通言語ランタイムはサーバーのガベージ コレクションを実行します。それ以外の場合は、ワークステーションのガベージ コレクションを実行します。 サーバーのガベージ コレクションは、2 つ以上のプロセッサを搭載したコンピューターでのみ使用できます。 既定では、この設定は無効になっています。

    この設定を有効にすると、自動的に <gcConcurrent> が無効になります。

GCLatencyMode の既定値は次のようになります。

  • <gcConcurrent> が有効であり、<gcServer> が無効であるときは Interactive

  • <gcConcurrent> が無効であるか、<gcServer> が有効であるときは Batch

メモメモ

同時実行ガベージ コレクションは、Intel Itanium アーキテクチャ (以前の IA-64) を実装する 64 ビット システム上で WOW64 x86 エミュレーターを実行しているアプリケーションではサポートされません。

待機時間の短いモード (LowLatency モード) を使用する場合のガイドライン

LowLatency モードを使用する場合は、次のガイドラインを検討してください。

  • 待機時間の短い期間を可能な限り短くするように保ちます。

  • 待機時間を短く設定している間は、大量のメモリの割り当てを回避します。 ガベージ コレクションが少数のオブジェクトしか解放できず、メモリ不足のメッセージが通知されることがあります。

  • 待機時間を短く設定しているときは、割り当て数を最小限に抑えます。特に、大きいオブジェクトのヒープやピン止めオブジェクトへの割り当てを抑えます。

  • 割り当てられる可能性のあるスレッドに注意します。 LatencyMode プロパティの設定はプロセス全体にわたるため、割り当て可能なスレッドで OutOfMemoryException が発生することがあります。

  • 制約された実行領域に、待機時間の短いコードをラップします (詳細については、「制約された実行領域」を参照してください)。

  • GC.Collect(Int32, GCCollectionMode) メソッドを呼び出すことによって、待機時間を短く設定している間でもジェネレーション 2 コレクションを強制できます。

参照

処理手順

方法 : 同時実行ガベージ コレクションを無効にする

概念

発生したコレクション

その他の技術情報

ガベージ コレクション