DA0018: 32 ビット アプリケーションがプロセスのマネージ メモリ制限で実行されています

規則 ID DA0018
カテゴリ プロファイリング ツールの使用
プロファイル方法 サンプリング
メッセージ マネージ メモリの割り当てが、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\# of Gen 0 Collections.NET CLR Memory\# of Gen 1 Collections.NET CLR Memory\# of Gen 2 Collections の各列で報告されたガベージ コレクションの割合と比較し、マネージ メモリ割り当てのパターンがガベージ コレクションの割合に影響を与えるかどうかを確認します。

.NET Framework アプリケーションでは、共通言語ランタイムによって、マネージ ヒープの合計サイズが、プロセス アドレス空間のプライベート領域部分の最大サイズの半分よりわずかに小さいサイズに制限されます。 32 ビット コンピューター上で実行している 32 ビット プロセスの場合、プロセスのアドレス空間のプライベート領域の上限は 2 GB です。 マネージ ヒープの合計サイズがその既定の制限値に近づくと、マネージ メモリのオーバーヘッドが増加し、アプリケーションのパフォーマンスが低下する可能性があります。

マネージ メモリの過剰なオーバーヘッドが問題になる場合は、次のいずれかの方法の実行を検討します。

  • マネージ メモリ リソースのアプリケーションによる使用を最適化する

    または

  • 32 ビット プロセスの仮想メモリの最大サイズに関するアーキテクチャ上の制約を解除する手順を実行する

    マネージ メモリ リソースのアプリケーションによる使用を最適化するには、.NET メモリ割り当てのプロファイリングを実行して、マネージ メモリ割り当てデータを収集します。 .NET メモリのデータ ビュー レポートを確認して、メモリ割り当てに関するアプリケーションのパターンを把握します。

    オブジェクトの有効期間ビューを使用して、ジェネレーションに残っており、その後そこから解放される、プログラムのデータ オブジェクトを確認します。

    割り当てビューを使用して、これらの割り当てが行われた実行パスを判断します。

    ガベージ コレクションのパフォーマンスを向上する方法の詳細については、Microsoft Web サイトの .NET Framework の技術記事、「ガベージ コレクタの基本とパフォーマンスのヒント」を参照してください。

    プロセス アドレス空間のプライベート部分のサイズに関する仮想メモリのアーキテクチャ上の制約を解除するには、64 ビット コンピューター上でこの 32 ビット プロセスを実行してみてください。 64 ビット コンピューター上で実行されている 32 ビット プロセスの場合、最大 4 GB のプライベート仮想メモリを取得できます。

    64 ビット コンピューター上で実行されている 64 ビット プロセスの場合、最大 8 TB のプライベート仮想メモリを取得できます。 アプリケーションを再コンパイルし、ネイティブの 64 ビット アプリケーションとして実行することを検討してください。 この規則は情報提供用であるため、是正措置は必要ない場合があります。