待機モード

オブジェクトを再利用するには、ガベージ コレクター (GC) で、アプリケーションで実行中のすべてのスレッドを停止する必要があります。 ガベージ コレクターがアクティブになるまでの期間を、待機時間と呼びます。

状況によっては、アプリケーションがデータの取得やコンテンツの表示を行うときなど、重要なときにフル ガベージ コレクションが発生し、パフォーマンスが低下することがあります。 ガベージ コレクターが作業に悪影響を与える度合いを調整するには、GCSettings.LatencyMode プロパティを System.Runtime.GCLatencyMode 値のいずれかに設定することができます。

低待機時間の設定

"低" 待機時間の設定の使用は、ガベージ コレクターによるアプリケーションへの関与が少なくなることを意味します。 ガベージ コレクションはメモリの再利用についてより控え目となります。

System.Runtime.GCLatencyMode 列挙体には、待機時間の短い設定として次の 2 つがあります。

  • GCLatencyMode.LowLatency では、ジェネレーション 2 のコレクションが停止し、ジェネレーション 0 および 1 コレクションのみが実行されます。 これは、短時間の場合にのみ使用できます。 この設定を長時間にわたって使用すると、システムのメモリが不足してガベージ コレクターがガベージ コレクションをトリガーした場合に、アプリケーションが少しの間停止したり、高速性を必要とする操作が中断されたりすることがあります。 この設定は、ワークステーションのガベージ コレクションでのみ使用できます。

  • GCLatencyMode.SustainedLowLatency では、フォアグラウンドのジェネレーション 2 のコレクションが停止し、ジェネレーション 0、1、およびバックグラウンドのジェネレーション 2 のコレクションのみが実行されます。 これは長時間にわたって使用でき、ワークステーションとサーバーの両方のガベージ コレクションで使用できます。 この設定は、バックグラウンドのガベージ コレクションが無効の場合には使用できません。

待機時間の短い設定になっている場合でも、次の状況ではジェネレーション 2 のガベージ コレクションの停止が解除されます。

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

  • アプリケーション コードから GC.Collect メソッドを呼び出し、generation パラメーターに 2 を指定してコレクションを実行した場合。

シナリオ

次の表に、GCLatencyMode の各値を使用するアプリケーション シナリオを示します。

待機時間モード アプリケーションのシナリオ
Batch ユーザー インターフェイス (UI) 操作のないアプリケーションの場合、またはサーバー側の操作の場合に使用します。

バックグラウンドのガベージ コレクションが無効にされている場合、これがワークステーションとサーバーのガベージ コレクションの既定のモードとなります。 また、Batch モードにより gcConcurrent 設定がオーバーライドされます。つまり、バックグラウンドまたは同時実行コレクションが阻止されます。
Interactive UI を持つほとんどのアプリケーションの場合に使用します。

これは、ワークステーションとサーバーのガベージ コレクションの既定のモードです。 ただし、アプリがホストされている場合は、ホスト プロセスのガベージ コレクター設定が優先されます。
LowLatency ガベージ コレクターからの割り込みにより重大な影響を受け、高速性を必要とする、短期間の操作を実行するアプリケーションの場合に使用します。 たとえば、アニメーションのレンダリングを行うアプリケーションやデータの取得機能などがあります。
SustainedLowLatency ガベージ コレクターからの割り込みにより重大な影響を受け、高速性を必要とする、さほど処理時間を必要としないものの長時間になる可能性のある操作を実行するアプリケーションの場合に使用します。 たとえば、取引時間中に市場データの変化に応じて迅速な応答時間を必要とするアプリケーションなどがあります。

このモードでは、マネージド ヒープのサイズが他のモードより大きくなります。 マネージド ヒープは最適化されないため、断片化の割合が高くなる可能性があります。 十分なメモリが使用可能であることを確認してください。

低待機時間の使用に関するガイドライン

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

  • 待機時間を短くする期間は、できるだけ短くします。

  • 待機時間を短くする期間中は、大量のメモリを割り当てないようにします。 ガベージ コレクションによって再利用されるオブジェクトの数が少なくなるため、メモリ不足の通知が発生する可能性があります。

  • 低待機時間モードの間は、新しい割り当ての数、特に大きなオブジェクト ヒープや固定されたオブジェクトへの割り当ての数を最小限に抑えます。

  • 割り当てられる可能性のあるスレッドに注意します。 LatencyMode プロパティの設定はプロセス全体に適用されるため、OutOfMemoryException 例外は割り当てられている任意のスレッドで生成できます。

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

  • 待機時間を短くする期間中でも、GC.Collect(Int32, GCCollectionMode) メソッドを呼び出せばジェネレーション 2 のガベージ コレクションを強制できます。

関連項目