tl; dr:タスクマネージャーは、ページメモリとプロセスの仮想空間に関する情報を非表示にします。 SysinternalsバンドルのProcess Explorerをより適切に使用します。
Windowsの割り当て
新しいプロセスを開始すると、OSはこのプロセスに連続したアドレス空間を割り当てます。 32ビットシステムでは、このスペースは4 GBで、通常はカーネル用に2 GB、残りはプロセス用になります。 この記事では、コアメモリの使用を無視します。 64ビットシステムでは、プロセスで予約されたメモリが64 TBにまで成長する可能性があります。 実際に悲惨な8 GBがある場合、このプロセスは数テラバイトのメモリで何をしますか? 最初に、予約メモリと転送メモリが何であるかを理解する必要があります。
予約および転送されたメモリ
この巨大なアドレス空間のすべての部分が等しいわけではありません。 プロセスのアドレス空間の一部は、実際には物理RAMまたはディスクのいずれかによってサポートされています(以下を参照)。 予約されたメモリは、OSが使用しようとしたときにこのメモリを提供する場合、コミット済みと見なされます。 残りのアドレススペース(これが圧倒的多数)は、引き続き予約可能です。 つまり、OSがこのメモリブロックを使用できるとは限りません。たとえば、ディスク(スワップファイル)にコピーを作成できる場合とできない場合があります。 C ++では、 VirtualAllocを呼び出すことでメモリが予約されます。 したがって、転送されるメモリはOSのハードウェア制限リソースです。 見てみましょう。
OSスワップファイル
スワップファイルは素晴らしいアイデアです。 基本的に、OSはメモリの一部がアプリケーションで特に使用されていないことを理解しています。 なぜ実際の物理メモリを使用するのですか? 代わりに、カーネル内のプロセスがこの未使用のフラグメントをディスクに書き込みます。 彼らが再び彼に目を向けるまで、そのときだけ彼は記憶に戻ります。
Windowsでメモリがどのように機能するかについての詳細な説明については、 Mark Russinovich による講演「Secrets of memory management」をお勧めします。
メモリ追跡
見て、分析することがたくさんあります。 誰に連絡しますか? もちろん、タスクマネージャーに!
RAMメモリは通常ワーキングセットと呼ばれ、割り当てられたすべてのメモリは通常プライベートバイトと呼ばれます。 DLLは定義を混乱させるので、今のところ無視してください。 言い換えれば:
Private Bytes [ ] = +
デフォルトでは、タスクマネージャーはすべてのプロセスのワーキングセットを正確に表示します。
そして、これは私がいつも見た数字です。 タスクマネージャで、転送されたメモリに関する情報が[
Commit Size
]列にあることをどのようにして知りましたか。 そこに仮想メモリに関する情報が見つかりませんでした。
列を右クリックして対応する項目を選択すると、タスクマネージャーを使用して、転送されたメモリに関する情報を追加できます。
効果的なメモリメトリック
幸いなことに、リソースを追跡するためのリソースは他にもたくさんあります。 PerfMon(システムモニター)は各Windowsマシンにインストールされ、各プロセスとシステム全体に関する非常に詳細な情報を提供します。
興味深いことに、システムモニターは、ネットワーク上の2台以上のコンピューターのメトリックを実際に調べて比較できます。 これは非常に強力なツールですが、タスクマネージャーは明らかにユーザーフレンドリーです。 中間ソリューションとしてProcess Explorerをお勧めします。
ブーム! Visual Studio、なぜあなたはまだ32ビットモードのままですか(その仮想サイズに注意してください)? コンピューターの最大メモリ使用量が最大値の89%であっても耐えることができます。 これは後で便利になります。
追加: VMMapやRAMMapを含む他の便利なツールを指し示したものが多数ありました 。
メモリ情報のデバッグ
幸いなことに、これらは不必要なOSの雑学ではありません。 メモリ消費に関する実際の情報は、さまざまな問題のデバッグに何度も役立ちました。
最も重要なことは、割り当てられたメモリの手つかずの部分を見つけることです。 スワップデータも重要です。このメモリは転送されますが、ほとんど使用されないか、まったく使用されません。
メモリがときどき使用される場合でも、これは高価なリソースであることを理解することが重要です。したがって、このようなパスをたどらないでください。 ここにメモリリークが表示されます。
これらの理由から、以前にページファイルを完全に削除し、割り当てられたメモリをワーキングセットと同等にする提案を聞きました。 ただし、これは両刃のアイデアです。 そうすると、メモリが無駄に予約されることがあるアプリケーションが正しく動作しない場合、OSはメモリをダンプできません。