DA0024: 過剰な GC CPU 時間
規則 ID |
DA0024 |
分類 |
.NET Framework の使用 |
プロファイル方法 |
すべて |
メッセージ |
GC の時間の割合が非常に高くなっています。 ガベージ コレクションのオーバーヘッドが過剰です。 |
規則の種類 |
警告 |
サンプリング、.NET メモリ、またはリソース競合メソッドを使用してプロファイリングを行うときは、この規則を呼び出すためのサンプルを少なくとも 10 個収集する必要があります。
原因
プロファイリングの実行中に収集されたシステム パフォーマンス データは、ガベージ コレクションで費やされた時間がアプリケーション全体の処理時間と比較して非常に長いことを示しています。
規則の説明
Microsoft .NET 共通言語ランタイム (CLR: Common Language Runtime) は、自動メモリ管理メカニズムを備えています。このメカニズムでは、ガベージ コレクターを使用して、アプリケーションが使用しなくなったオブジェクトのメモリを解放します。 ガベージ コレクターはジェネレーション指向です。これは、多くの割り当てが短時間で終了することを前提としています。 たとえば、ローカル変数の有効期間は短時間で終了します。 新しく作成されたオブジェクトはジェネレーション 0 (gen 0) から始まり、ガベージ コレクションの実行中に破棄されなければジェネレーション 1 に昇格します。その後もアプリケーションによって引き続き使用されていれば、最後はジェネレーション 2 に昇格します。
ジェネレーション 0 のオブジェクトの収集頻度は高く、通常は非常に効率的に収集されます。 ジェネレーション 1 のオブジェクトの収集頻度はそれよりも低くなり、収集効率も下がります。 有効期間の長いジェネレーション 2 のオブジェクトの場合、収集頻度はさらに低くなります。 また、ジェネレーション 2 のコレクション (フル ガベージ コレクションの実行) は、最も負荷のかかる操作になります。
この規則は、ガベージ コレクションで費やされた時間がアプリケーション全体の処理時間と比較して非常に大きくなった場合に適用されます。
注意
ガベージ コレクションで費やされた時間がアプリケーション全体の処理時間と比較して大きいが過度ではない場合は、この規則の代わりに "DA0023: 高い GC CPU 時間" の警告が適用されます。
警告の調査方法
[エラー一覧] ウィンドウに表示されたメッセージをダブルクリックして、プロファイル データの マーク ビュー に移動します。 ビューが表示されたら、[.NET CLR Memory\% Time in GC] 列を探します。 次にこの列で、マネージ メモリのガベージ コレクションによる負荷が他よりも高いプログラム実行フェーズがないかどうかを確認します。 次に、% Time in GC の値を、[# Gen 0 Collections]、[# Gen 1 Collections]、[# Gen 2 Collections] に表示されたガベージ コレクションの各比率と比較します。
% Time in GC の値は、アプリケーションによるガベージ コレクションの実行時間を、全体の合計処理時間に比例した形式で表したものです。 非常に高い値が % Time in GC の値として表示されることがありますが、これは過剰なガベージ コレクションが原因ではないことに注意してください。 % Time in GC の値の計算方法の詳細については、MSDN の「Maoni's Weblog」のエントリ「Difference Between Perf Data Reported by Different Tools – 4 (異なるツールによって報告されたパフォーマンス データの違い - 4)」を参照してください。 ページ フォールトが発生する場合や、ガベージ コレクションの実行中に他の優先度の高い作業によってアプリケーションがコンピューター上で占有されている場合は、このような追加の遅延時間も % Time in GC カウンターに反映されます。