あなたが説明しているのは、.NET プログラムの完全に正常な動作であり、コードに問題があることを示すものではありません。
最大の問題は、TaskMgr.exe が、プロセスで何が起こっているかを伝えるのに適したプログラムではないということです。プロセスの「ワーキング セット」を表示します。この数値は、プロセスが使用するメモリの量とはほとんど関係がありません。
ワーキング セットは、プロセスが使用する RAM の量です。すべてのプロセスは、コードとデータに使用する2 ギガバイトの仮想メモリを取得します。512 MB の RAM しかない仮想 XP ボックスでも。ただし、これらのプロセスはすべて、動作する一定量の RAM しかありません。ギガバイトほどの低価格のマシンで。
明らかに複数のプロセスが実行されており、それぞれがギガバイトの仮想メモリを持ち、実際のメモリはわずか 1 ギガバイトです。これはオペレーティング システムによって提供され、Windows は RAM を仮想化します。つまり、2 ギガバイトの RAM を搭載したマシン上で各プロセスが独自に実行されているような錯覚を引き起こします。これは、ページングと呼ばれる機能によって行われます。プロセスがメモリの読み取りまたは書き込みを行う必要があるときはいつでも、オペレーティング システムは物理メモリを提供するために RAM のチャンクを取得します。
必然的に、別のプロセスから RAM を奪って、自分のプロセスで利用できるようにする必要があります。以前にその RAM のチャンクにあったものはすべて保持する必要があります。それがページング ファイルの機能です。ページ アウトされた RAM の内容を保存します。
明らかに、これは無料ではありません。ディスクはかなり遅く、ページングは高価な操作です。そのため、いくつかの大きなプログラムを実行するように頼むと、性能の低いマシンのパフォーマンスが低下します。これに対する実際の対策は TaskMgr.exe にも表示されますが、追加する必要があります。表示 + 列を選択し、「ページ フォールト デルタ」にチェックマークを付けます。プロセスの実行中にこの数を観察します。スパイクが見られると、プログラムの速度が大幅に低下し、表示されるメモリ使用量が急速に変化することが予想されます。
あなたの観察に対処する:
オブジェクトの作成...タスクマネージャーは、予想どおり、メモリ使用量が「ジャンプ」することを示しています
はい、RAM を使用しているため、ワーキング セットが増加します。
これらのメモリ使用量の「ジャンプ」は、ユーザーの操作が終了した後も実行され続けます
スラムダンクはありませんが、RAM を順番に使用し、他のプロセスの実行時間を増やして、他のプロセスの実行時間を増やします。ページ フォールト デルタ列を確認します。
私は Ants mem プロファイラーを使用しましたが、ユーザーの操作後にこれらの「ジャンプ」が発生するのをある程度防ぎます。
はい、メモリプロファイラーは、プログラムの実際のメモリ使用量、つまり仮想メモリの種類に焦点を当てています。彼らは主にワーキング セットを無視します。それについてできることは何もありません。また、他のプロセスが実行されているかどうかに実際に依存するため、数値は無意味です。
メモリ使用量が増えて崩壊するまで増える場合がある
これはガベージ コレクターの副作用である可能性がありますが、一般的ではありません。おそらく、Windows がワーキング セットをトリミングし、ページを削除して、消費しすぎないようにしているのを見ているだけでしょう。
512MB の RAM しか割り当てられていない Windows XP モード マシン (Win 7 の VM) では、正常に動作します。
これは、その WM に RAM を競合する大きなプログラムをインストールしていないことが原因である可能性があります。XP はメモリが非常に少ないマシンでもうまく動作するように設計されており、256 MB のマシンではスムーズに動作します。これは、Vista/Win7 にはまったく当てはまらず、最新のマシン ハードウェアを利用するように設計されています。Aero のような機能は目を楽しませてくれますが、非常に高価です。
システムに他の重いプログラムが実行されている場合、問題はさらに悪化します
はい、大量の RAM を必要とする他のプロセスと競合しています。
メモリ使用量がロケットのように上昇している間は、ダイアグラムの最初のシンボルでさえ作成できません
はい、ページが RAM にマップされ、ページング ファイルと ngen-ed .ni.dll ファイルからリロードされます。ワーキングセットを再び急速に増やします。また、ページ フォールト デルタ数のピークも見られます。
結論として、WPF プログラムは大量のメモリを消費し、適切に動作するには馬力が必要です。これを修正するのは簡単ではありません。リソース要件を下げるには、かなり抜本的な再設計が必要です。したがって、システム要件をボックスに記載するだけで、そうすることはまったく正常です。