DA0005: 頻繁な GC2 のコレクションです
規則 ID |
DA0005 |
分類 |
.NET Framework の使用 |
プロファイル方法 |
.NET メモリ |
メッセージ |
オブジェクトの多くはジェネレーション 2 のガベージ コレクションで収集されています。 |
メッセージの種類 |
警告 |
原因
多数の .NET メモリ オブジェクトが、ジェネレーション 2 のガベージ コレクションで再利用されています。
規則の説明
Microsoft .NET 共通言語ランタイム (CLR: Common Language Runtime) は、自動メモリ管理メカニズムを備えています。このメカニズムは、ガベージ コレクターを使用して、アプリケーションで使用されなくなったオブジェクトのメモリを解放します。 ガベージ コレクターはジェネレーション指向です。これは、多くの割り当てが短時間で終了することを前提としています。 たとえば、ローカル変数の有効期間は短時間で終了します。 新しく作成されたオブジェクトはジェネレーション 0 (gen 0) から始まり、ガベージ コレクションの実行中に破棄されなければジェネレーション 1 に昇格します。その後もアプリケーションによって引き続き使用されていれば、最後はジェネレーション 2 に昇格します。
ジェネレーション 0 のオブジェクトの収集頻度は高く、通常は非常に効率的に収集されます。 ジェネレーション 1 のオブジェクトの収集頻度はそれよりも低くなり、収集効率も下がります。 有効期間の長いジェネレーション 2 のオブジェクトの場合、収集頻度はさらに低くなります。 また、ジェネレーション 2 のコレクション (フル ガベージ コレクションの実行) は、最も負荷のかかる操作になります。
この規則は、ジェネレーション 2 のガベージ コレクションの発生率が高くなりすぎた場合に適用されます。 多数の有効期間が比較的短いオブジェクトが、ジェネレーション 1 のコレクションでは収集されずにジェネレーション 2 のフル コレクションで収集されると、メモリ管理のコストが高くなる可能性があります。 詳細については、MSDN Web サイトの「Rico Mariani's Performance Tidbits (Rico Mariani が紹介するパフォーマンスに関するニュース)」ブログの投稿「Mid-life crisis (ミッドライフ クライシス)」を参照してください。
警告の調査方法
プロファイリング ツール .NET メモリのデータ ビュー レポートを確認して、メモリ割り当てに関するアプリケーションのパターンを把握します。 オブジェクトの有効期間ビュー を使用して、ジェネレーション 2 に残っており、その後そこからクリアされる、プログラムのデータ オブジェクトを確認します。 .NET メモリの割り当てビュー を使用して、これらの割り当てが行われた実行パスを判断します。
ガベージ コレクションのパフォーマンスを向上させる方法の詳細については、Microsoft Web サイトの「ガベージ コレクターの基本とパフォーマンスのヒント」を参照してください。 自動ガベージ コレクションのオーバーヘッドの詳細については、「大きなオブジェクト ヒープの秘密」を参照してください。