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

規則 IDRule Id DA0021DA0021
カテゴリCategory .NET Framework の使用.NET Framework Usage
プロファイル方法Profiling methods すべてAll
メッセージMessage 比較的高い率のジェネレーション 1 ガベージ コレクションが発生しています。There is a fairly high rate of Gen 1 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 情報Information

サンプリング、.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

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

規則の説明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.

この規則は、ジェネレーション 1 のガベージ コレクションの発生率が高くなりすぎた場合に適用されます。This rule fires when proportionally too many generation 1 garbage collections have occurred. 有効期間が短いオブジェクトの多くが、ジェネレーション 0 のコレクションでは収集されずにジェネレーション 1 のコレクションで収集される場合、メモリ管理のコストが高くなる可能性があります。If too many fairly short-lived objects survive generation 0 collection but are then able to be collected in a generation 1 collection, the cost of memory management can become excessive. 詳細については、MSDN Web サイトの「Rico Mariani's Performance Tidbits」 (Rico Mariani のパフォーマンスに関する話題) の「Mid-life crisis」 (有効期間半ばでの危機) の投稿を参照してください。For more information, see the Mid-life crisis post on the Rico Mariani's Performance Tidbits on the MSDN Web site.

警告の調査方法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.

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

ガベージ コレクションのパフォーマンスの向上の方法の詳細については、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.