DA0018: 32 ビット アプリケーションがプロセスのマネージ メモリ制限で実行されています
規則 ID |
DA0018 |
[カテゴリ] |
プロファイリング ツールの使用 |
プロファイル方法 |
サンプリング |
Message |
マネージ メモリの割り当てが、32 ビット プロセスに対する既定の制限に近づいています。アプリケーションがメモリ バインドされている可能性があります。 |
規則の種類 |
[警告] |
サンプリング、.NET メモリ、またはリソース競合メソッドを使用してプロファイリングを行うときは、この規則を呼び出すためのサンプルを少なくとも 10 個収集する必要があります。
原因
プロファイリングの実行中に収集されたシステム データは、.NET Framework メモリ ヒープが 32 ビット プロセスのマネージ ヒープの到達可能な最大サイズに達したことを示しています。この最大サイズは既定値です。この値は、プライベート バイトに割り当てることのできるプロセス アドレス空間の総量に基づいて決まります。報告される値は、プロファイリング中のプロセスがアクティブな状態にあったときに測定されたヒープの最大値です。.NET メモリ プロファイル方法を使用してもう一度プロファリングを実行し、アプリケーションによるマネージ リソースの使用を最適化してください。
マネージ ヒープのサイズが既定の制限値に達すると、自動ガベージ コレクション プロセスのより頻繁な呼び出しが必要になる場合があります。これにより、メモリ管理のオーバーヘッドが増加します。
この規則は、32 ビット コンピューター上で実行している 32 ビット アプリケーションに対してのみ適用されます。
規則の説明
Microsoft .NET 共通言語ランタイム (CLR: Common Language Runtime) は、自動メモリ管理メカニズムを備えています。このメカニズムでは、ガベージ コレクターを使用して、アプリケーションが使用しなくなったオブジェクトのメモリを解放します。ガベージ コレクターはジェネレーション指向です。これは、多くの割り当てが短時間で終了することを前提としています。たとえば、ローカル変数の有効期間は短時間で終了します。新しく作成されたオブジェクトはジェネレーション 0 (gen 0) から始まり、ガベージ コレクションの実行中に破棄されなければジェネレーション 1 に昇格します。その後もアプリケーションによって引き続き使用されていれば、最後はジェネレーション 2 に昇格します。
85 KB より大きいマネージ オブジェクトは、大きいオブジェクト ヒープに割り当てられます。このヒープでは、小さいオブジェクトより少ない頻度でオブジェクトのガベージ コレクションと圧縮が実行されます。大きいオブジェクトは永続性があると見なされ、また、永続性のある大きいオブジェクトと頻繁に割り当てられる小さいオブジェクトが混在すると、最悪の場合ヒープの断片化が発生する可能性があるため、大きいオブジェクトは個別に管理されます。
マネージ ヒープの合計サイズが既定の制限値に近づくと、通常、メモリ管理のオーバーヘッドが増加し、アプリケーションの応答性とスケーラビリティに影響するようになります。
警告の調査方法
[エラー一覧] ウィンドウに表示されたメッセージをダブルクリックして、[マーク] ビューに移動します。[.NET CLR Memory\# Bytes in all Heaps] 列と [# Total committed bytes] 列を見つけます。マネージ メモリの割り当てが他のフェーズよりも多い特定のプログラム実行フェーズがあるかどうかを確認します。[# Bytes in all Heaps] 列の値を、[.NET CLR Memory\# Gen 0 Collections]、[.NET CLR Memory\# Gen 1 Collections]、[.NET CLR Memory\# Gen 2 Collections] の各列で報告されたガベージ コレクションの割合と比較し、マネージ メモリ割り当てのパターンがガベージ コレクションの割合に影響を与えるかどうかを確認します。
.NET Framework アプリケーションでは、共通言語ランタイムによって、マネージ ヒープの合計サイズが、プロセス アドレス空間のプライベート領域部分の最大サイズの半分よりわずかに小さいサイズに制限されます。32 ビット コンピューター上で実行している 32 ビット プロセスの場合、2 GB はプロセス アドレス空間のプライベート部分の上限を表します。マネージ ヒープの合計サイズがその既定の制限値に近づくと、マネージ メモリのオーバーヘッドが増加し、アプリケーションのパフォーマンスが低下する可能性があります。
マネージ メモリの過剰なオーバーヘッドが問題になる場合は、次のいずれかの方法の実行を検討します。
マネージ メモリ リソースのアプリケーションによる使用を最適化する
または
32 ビット プロセスの仮想メモリの最大サイズに関するアーキテクチャ上の制約を解除する手順を実行する
マネージ メモリ リソースのアプリケーションによる使用を最適化するには、.NET メモリ割り当てのプロファイリングを実行して、マネージ メモリ割り当てデータを収集します。プロファイリング ツール .NET メモリのデータ ビュー レポートを確認して、メモリ割り当てに関するアプリケーションのパターンを把握します。
オブジェクトの有効期間ビュー を使用して、ジェネレーションに残っており、その後そこから解放される、プログラムのデータ オブジェクトを確認します。
.NET メモリの割り当てビュー を使用して、これらの割り当てが行われた実行パスを判断します。
ガベージ コレクションのパフォーマンスを向上する方法の詳細については、MSDN Web サイトの .NET Framework 技術文書「ガベージ コレクターの基本とパフォーマンスのヒント」を参照してください。
プロセス アドレス空間のプライベート部分のサイズに関する仮想メモリのアーキテクチャ上の制約を解除するには、64 ビット コンピューター上でこの 32 ビット プロセスを実行してみてください。64 ビット コンピューター上の 32 ビット プロセスは、最大 4 GB のプライベート仮想メモリを取得できます。
64 ビット コンピューター上で実行している 64 ビット プロセスは、最大 8 TB の仮想メモリを取得できます。アプリケーションを再コンパイルし、ネイティブの 64 ビット アプリケーションとして実行することを検討してください。この規則は情報提供用であるため、是正措置は必要ない場合があります。