待機モード
更新 : 2007 年 11 月
オブジェクトを解放するには、ガベージ コレクタが、アプリケーションで実行しているすべてのスレッドを停止する必要があります。アプリケーションがデータの取得やコンテンツの表示を行うときなど、状況によっては、重要な局面でフル ガベージ コレクションが発生し、パフォーマンスに影響を及ぼすことがあります。LatencyMode プロパティを GCLatencyMode 値のいずれかに設定すると、ガベージ コレクションの割り込みの動作を調整できます。
"待機" とは、ガベージ コレクタがアプリケーションに関与する時間を指します。待機時間が短い場合、オブジェクトの解放において、ガベージ コレクタは慎重かつ控えめに動作します。ジェネレーション 2 のコレクションが行われる頻度が低くなります。このことは、時間が経過するにつれてアプリケーション作業セットの増大につながります。したがって、LowLatency モードは、必要な場合に短い時間に限って使用することをお勧めします。そうしないと、システムがメモリ圧迫の状態にある場合にガベージ コレクタがコレクションを実行し、アプリケーションの停止や、処理速度が重要視される操作の中断が一時的に発生する状況を生み出します。
待機モードは、短時間に実行するコード ブロックを含むアプリケーションで使用し、実行するときはランタイムからの中断を最小限に抑えることが必要です。LowLatency モードは時間的な制約のあるシナリオで使用するように設計されていますが、厳密なリアルタイム制約のあるシナリオを解決することを意図したものではありません。
各 GCLatencyMode 値に適したアプリケーション シナリオを次の表に示します。
待機モード |
アプリケーション シナリオ |
---|---|
UI の操作やサーバー側の操作がないアプリケーションに適しています。
|
|
UI のあるほとんどのアプリケーションに適しています。 |
|
ガベージ コレクタによる中断の影響を受ける可能性がある場合、短時間に実行されることが重要なアプリケーションに適しています。たとえば、アニメーションのレンダリングやデータの取得を行うアプリケーションなどが該当します。 |
ガベージ コレクションの既定のモード
LatencyMode プロパティが指定されていない場合は、ワークステーション上で同時実行されるガベージ コレクションが既定のモードになります。このモードは、次に挙げる 2 つのランタイム構成設定の値に依存します。
-
有効な場合、共通言語ランタイムは別のスレッドでワークステーションのガベージ コレクションを実行し、同時実行操作をサポートします。この設定は既定で有効になっています。
-
有効な場合、共通言語ランタイムはサーバーのガベージ コレクションを実行します。それ以外の場合は、ワークステーションのガベージ コレクションを実行します。サーバーのガベージ コレクションは、2 つ以上のプロセッサを搭載したコンピュータでのみ使用できます。既定では、この設定は無効になっています。
この設定を有効にすると、自動的に <gcConcurrent> が無効になります。
GCLatencyMode の既定値は次のようになります。
<gcConcurrent> が有効であり、<gcServer> が無効であるときは Interactive。
<gcConcurrent> が無効であるか、<gcConcurrent> と <gcServer> の両方が有効であるときは Batch。
メモ : |
---|
同時実行ガベージ コレクションは、Intel Itanium アーキテクチャ (以前の IA-64) を実装する 64 ビット システム上で WOW64 x86 エミュレータを実行しているアプリケーションではサポートされません。64 ビットの Windows システムで WOW64 を使用する方法の詳細については、「Running 32-bit Applications」を参照してください。 |
待機時間の短いモード (LowLatency モード) を使用する場合のガイドライン
LowLatency モードを使用する場合は、次のガイドラインを検討してください。
待機時間の短い期間を可能な限り短くするように保ちます。
待機時間を短く設定している間は、大量のメモリの割り当てを回避します。ガベージ コレクションが少数のオブジェクトしか解放できず、メモリ不足のメッセージが通知されることがあります。
待機時間を短く設定しているときは、割り当て数を最小限に抑えます。特に、大きいオブジェクトのヒープやピン止めオブジェクトへの割り当てを抑えます。
割り当てられる可能性のあるスレッドに注意します。LatencyMode プロパティの設定はプロセス全体にわたるため、割り当て可能なスレッドで OutOfMemoryException が発生することがあります。
制約された実行領域に、待機時間の短いコードをラップします (詳細については、「制約された実行領域」を参照してください)。
GC.Collect(Int32, GCCollectionMode) メソッドを呼び出すことによって、待機時間を短く設定している間でもジェネレーション 2 コレクションを強制できます。