オブジェクトを再利用するには、ガベージ コレクター (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 のコレクションを強制できます。
こちらも参照ください
.NET