DA0022: ジェネレーション 2 のガベージ コレクションが高率です
規則 ID |
DA0022 |
[カテゴリ] |
.NET Framework の使用 |
プロファイル方法 |
すべて |
Message |
比較的高い率のジェネレーション 2 ガベージ コレクションが発生しています。設計によってプログラムのほとんどのデータ構造が長時間割り当てられて保持される場合は、通常これは問題ではありません。一方、意図した動作でない場合は、アプリケーションがオブジェクトを固定している可能性があります。はっきりしない場合は、.NET のメモリ割り当てデータとオブジェクト ライフタイム情報を収集することで、アプリケーションが使用しているメモリ割り当てのパターンを知ることができます。 |
規則の種類 |
[警告] |
サンプリング、.NET メモリ、またはリソース競合メソッドを使用してプロファイリングを行うときは、この規則を呼び出すためのサンプルを少なくとも 10 個収集する必要があります。
原因
プロファイリングの実行中に収集されたシステム パフォーマンス データが、ジェネレーション 2 のガベージ コレクションで解放された .NET Framework オブジェクト用のメモリが、ジェネレーション 0 およびジェネレーション 1 のガベージ コレクションと比較して高率であることを示しています。
規則の説明
Microsoft .NET 共通言語ランタイム (CLR: Common Language Runtime) は、自動メモリ管理メカニズムを備えています。このメカニズムでは、ガベージ コレクターを使用して、アプリケーションが使用しなくなったオブジェクトのメモリを解放します。ガベージ コレクターはジェネレーション指向です。これは、多くの割り当てが短時間で終了することを前提としています。たとえば、ローカル変数の有効期間は短時間で終了します。新しく作成されたオブジェクトはジェネレーション 0 (gen 0) から始まり、ガベージ コレクションの実行中に破棄されなければジェネレーション 1 に昇格します。その後もアプリケーションによって引き続き使用されていれば、最後はジェネレーション 2 に昇格します。
ジェネレーション 0 のオブジェクトの収集頻度は高く、通常は非常に効率的に収集されます。ジェネレーション 1 のオブジェクトの収集頻度はそれよりも低くなり、収集効率も下がります。有効期間の長いジェネレーション 2 のオブジェクトの場合、収集頻度はさらに低くなります。また、ジェネレーション 2 のコレクション (フル ガベージ コレクションの実行) は、最も負荷のかかる操作になります。
この規則は、ジェネレーション 2 のガベージ コレクションの発生率が高くなりすぎた場合に適用されます。適切に動作する .NET Framework アプリケーションでは、ジェネレーション 2 のガベージ コレクションの 5 倍を超える頻度でジェネレーション 1 のコレクションが発生します。(最適な頻度は 10 倍と考えられます。)
警告の調査方法
[エラー一覧] ウィンドウに表示されたメッセージをダブルクリックして、プロファイル データの マーク ビュー に移動します。[.NET CLR Memory\# Gen 0 Collections] 列と [.NET CLR Memory\# Gen 1 Collections] 列を探します。ガベージ コレクションがより高い頻度で発生している特定のプログラム実行フェーズがあるかどうかを確認します。これらの値を [% Time in GC] 列と比較して、マネージ メモリの割り当てパターンによって過剰なメモリ管理オーバーヘッドが発生しているかどうかを調べます。
Gen 2 のガベージ コレクションの発生率が高いことは、常に問題になるわけではありません。設計上そのようになっている場合もあります。大きなデータ構造を割り当てて、それを実行中に長期間アクティブにしておく必要があるアプリケーションでは、この規則が呼び出される可能性があります。そのようなアプリケーションがメモリ圧迫の状態にあるときは、頻繁にガベージ コレクションを実行しなければならなくなります。より負荷の小さいジェネレーション 0 およびジェネレーション 1 のガベージ コレクションで少量のマネージ メモリしか解放できない場合、ジェネレーション 2 のガベージ コレクションのスケジュール頻度が高くなります。
[マーク] ビューには、ガベージ コレクションの問題の特定に役立つ [.NET CLR Memory] の列が他にもあります。[% Time in GC] 列は、どれだけのメモリ管理オーバーヘッドが発生しているかを調べるのに役立ちます。アプリケーションで通常使用するオブジェクトが、比較的少数の大きいオブジェクトではなく永続オブジェクトである場合、ジェネレーション 2 のコレクションの頻繁な実行によって大量の CPU 時間が消費されないようにする必要があります。アプリケーションが物理メモリ (RAM) 不足のためにメモリ圧迫の状態にある場合、[Memory\Pages/sec] 列の値を評価する関連規則も呼び出される可能性があります。
アプリケーションのマネージ メモリの使用パターンを調べるには、.NET メモリの割り当てのプロファイルを使用して再度アプリケーションのプロファイリングを行い、オブジェクトの有効期間プロファイリング オプションを選択します。
ガベージ コレクションのパフォーマンスを向上させる方法の詳細については、Microsoft Web サイトの「ガベージ コレクターの基本とパフォーマンスのヒント」を参照してください。自動ガベージ コレクションのオーバーヘッドの詳細については、「大きなオブジェクト ヒープの秘密」を参照してください。