DA0022: ジェネレーション 2 のガベージ コレクションが高率ですDA0022: High rate of Gen 2 garbage collections

規則 IDRule Id DA0022DA0022
カテゴリCategory .NET Framework の使用.NET Framework Usage
プロファイル方法Profiling method すべてAll
メッセージMessage 比較的高い率のジェネレーション 2 ガベージ コレクションが発生しています。There is a fairly high rate of Gen 2 garbage collections occurring. 設計によりプログラムのほとんどのデータ構造が長時間割り当てられて保持される場合は、通常これは問題ではありません。If, by design, most of your program's data structures are allocated and persisted for a long time, this is not ordinarily a problem. 一方、意図した動作でない場合は、アプリケーションがオブジェクトを固定している可能性があります。However, if this behavior is unintended, your application may be pinning objects. 不明な場合は、.NET のメモリ割り当てデータとオブジェクト ライフタイム情報を収集することで、アプリケーションが使用しているメモリ割り当てのパターンを知ることができます。If you are not sure, you can gather .NET memory allocation data and object lifetime information to understand the pattern of memory allocation your application uses.
規則の種類Rule type 警告Warning

サンプリング、.NET メモリ、またはリソース競合メソッドを使用してプロファイリングを行うときは、この規則を呼び出すためのサンプルを少なくとも 10 個収集する必要があります。When you profile by using the sampling, .NET memory, or resource contention methods, you must collect at least 10 samples to trigger this rule.

原因Cause

プロファイリングの実行中に収集されたシステム パフォーマンス データが、ジェネレーション 2 のガベージ コレクションで解放された .NET Framework オブジェクト用のメモリが、ジェネレーション 0 およびジェネレーション 1 のガベージ コレクションと比較して高率であることを示しています。System performance data that was collected during profiling indicate that a significant proportion of the memory for.NET Framework objects was reclaimed in generation 2 of garbage collection compared to generation 0 and generation 1 garbage collections.

規則の説明Rule Description

Microsoft .NET 共通言語ランタイム (CLR: Common Language Runtime) は、自動メモリ管理メカニズムを備えています。このメカニズムでは、ガベージ コレクターを使用して、アプリケーションが使用しなくなったオブジェクトのメモリを解放します。The Microsoft .NET common language run-time (CLR) provides an automatic memory management mechanism that uses a garbage collector to reclaim memory from objects that the application no longer uses. ガベージ コレクターはジェネレーション指向です。これは、多くの割り当てが短時間で終了することを前提としています。The garbage collector is generation-oriented, based on the assumption that many allocations are short-lived. たとえば、ローカル変数の有効期間は短時間です。Local variables, for example, should be short-lived. 新しく作成されたオブジェクトはジェネレーション 0 (gen 0) から始まり、ガベージ コレクションの実行中に破棄されなければジェネレーション 1 に昇格します。その後もアプリケーションによって引き続き使用されていれば、最後はジェネレーション 2 に昇格します。Newly created objects start in generation 0 (gen 0), and then they progress to generation 1 when they survive a garbage collection run, and finally transition to generation 2 if the application still uses them.

ジェネレーション 0 のオブジェクトの収集頻度は高く、通常は非常に効率的に収集されます。Objects in generation 0 are collected frequently and usually very efficiently. ジェネレーション 1 のオブジェクトの収集頻度はそれよりも低くなり、収集効率も下がります。Objects in generation 1 are collected less frequently and less efficiently. 有効期間の長いジェネレーション 2 のオブジェクトの場合、収集頻度はさらに低くなります。Finally, long-lived objects in generation 2 should be collected even less frequently. また、ジェネレーション 2 のコレクション (フル ガベージ コレクションの実行) は、最も負荷のかかる操作になります。Generation 2 collection, which is a full garbage collection run, is also the most expensive operation.

この規則は、ジェネレーション 2 のガベージ コレクションの発生率が高くなりすぎた場合に適用されます。This rule fires when proportionally too many generation 2 garbage collections are occurring. 適切に動作する .NET Framework アプリケーションでは、ジェネレーション 1 のガベージ コレクションはジェネレーション 2 のコレクションの 5 倍を超える頻度で発生します。Well-behaved .NET Framework applications will have more than 5 times as many generation 1 garbage collections as generation 2 collections. (最適な頻度は 10 倍です。)(A 10x factor is probably ideal.)

警告の調査方法How to Investigate a Warning

[エラー一覧] ウィンドウに表示されたメッセージをダブルクリックして、プロファイル データの [マーク] ビューに移動します。Double-click the message in the Errors List window to navigate to the Marks View of the profiling data. .NET CLR Memory\# of Gen 0 Collections 列と .NET CLR Memory\# of Gen 1 Collections 列を探します。Find the .NET CLR Memory\# of Gen 0 Collections and .NET CLR Memory\# of Gen 1 Collections columns. ガベージ コレクションがより高い頻度で発生している特定のプログラム実行フェーズがあるかどうかを確認します。Determine if there are specific phases of program execution where garbage collection is occurring more frequently. これらの値を % Time in GC 列と比較して、マネージ メモリの割り当てパターンによって過剰なメモリ管理オーバーヘッドが発生しているかどうかを調べます。Compare these values to the % Time in GC column to see if the pattern of managed memory allocations is causing excessive memory management overhead.

Gen 2 のガベージ コレクションの発生率が高いことは、常に問題になるわけではありません。A high proportion of Generation 2 garbage collections is not always a problem. 設計上そのようになっている場合もあります。It might be by design. 大きなデータ構造が割り当てられ、それが実行中に長期間アクティブになっている必要があるアプリケーションでは、この規則が適用される場合があります。An application that allocates large data structures that must remain active for long periods during execution may trigger this rule. そのようなアプリケーションでメモリが不足する場合は、頻繁にガベージ コレクションを実行する必要があります。When such an application is under memory pressure, it may be forced to perform frequent garbage collections. より負荷の小さいジェネレーション 0 およびジェネレーション 1 のガベージ コレクションで少量のマネージ メモリしか解放できない場合、ジェネレーション 2 のガベージ コレクションのスケジュール頻度が高くなります。If the less expensive Generation 0 and Generation 1 garbage collections can reclaim only a small amount managed memory, more frequent Generation 2 garbage collections will be scheduled.

[マーク] ビューには、ガベージ コレクションの問題の特定に役立つ .NET CLR Memory の列が他にもあります。There are additional .NET CLR Memory columns in the Marks View that can help you identify garbage collection issues. % Time in GC 列は、どれだけのメモリ管理オーバーヘッドが発生しているかを調べるのに役立ちます。The % Time in GC column helps you understand how much memory management overhead is occurring. アプリケーションで通常使用するオブジェクトが、かなり少数の大きい永続オブジェクトである場合、ジェネレーション 2 のコレクションの頻繁な実行によって大量の CPU 時間が消費されないようにする必要があります。If your application typically uses a fairly small number of large but persistent objects, then frequent Generation 2 collections should not consume excessive amounts of CPU time. アプリケーションが物理メモリ (RAM) 不足のためにメモリ不足になる場合、Memory\Pages/sec 列の値を評価する関連規則も呼び出される可能性があります。If the application is under memory pressure because more Physical Memory (RAM) is required, related rules that evaluate the Memory\Pages/sec column values may also fire.

アプリケーションのマネージ メモリの使用パターンを調べるには、.NET メモリの割り当てのプロファイルを使用して再度アプリケーションのプロファイリングを行い、オブジェクトの有効期間プロファイリング オプションを選択します。To understand the application's pattern of managed memory usage, profile it again running a.NET Memory allocation profile and select the Object Lifetime profiling option.

ガベージ コレクションのパフォーマンスの向上の方法の詳細については、Microsoft Web サイトの「ガベージ コレクターの基本とパフォーマンスのヒント」を参照してください。For information about how to improve garbage collection performance, see Garbage Collector Basics and Performance Hints on the Microsoft Web site. 自動ガベージ コレクションのオーバーヘッドについては、「Large Object Heap Uncovered」 (大きなオブジェクト ヒープの秘密) を参照してください。For information about the overhead of automatic garbage collection, see Large Object Heap Uncovered.