この質問の簡単な答えは、これらの値はどれも、実行可能ファイルが実際に使用しているメモリの量を示す信頼できる指標ではなく、メモリリークのデバッグに本当に適切なものではないということです。
Private Bytesは、プロセス実行可能ファイルが要求したメモリの量を示します。必ずしも実際に使用している量ではありません。それらは(通常)メモリマップファイル(つまり共有DLL)を除外するため、「プライベート」です。しかし、ここが問題です。これらのファイルによって割り当てられたメモリが必ずしも除外されるわけではありません。プライベートバイトの変更が実行可能ファイル自体によるものか、リンクされたライブラリによるものかを判断する方法はありません。プライベートバイトも物理メモリだけではありません。それらはディスクまたはスタンバイページリストにページングできます(つまり、使用されていませんが、まだページングされていません)。
ワーキングセットは、プロセスによって使用される物理メモリ(RAM)の合計を指します。ただし、プライベートバイトとは異なり、これにはメモリマップファイルやその他のさまざまなリソースも含まれるため、プライベートバイトよりも正確な測定ではありません。これは、タスクマネージャーの「Mem Usage」で報告される値と同じであり、近年、無限の混乱の原因となっています。ワーキングセットのメモリは、ページフォールトなしでアドレスできるという意味で「物理的」です。ただし、スタンバイページのリストも物理的にはメモリ内にありますが、ワーキングセットでは報告されません。そのため、アプリケーションを最小化すると、「メモリ使用量」が突然低下する場合があります。
仮想バイトは合計ですプロセス全体が占める仮想アドレス空間です。これは、メモリマップトファイル(共有DLL)が含まれているという意味でワーキングセットに似ていますが、スタンバイリストのデータと、すでにページアウトされていて、ディスクのどこかにあるページファイルにあるデータも含まれています。負荷が高いシステムのすべてのプロセスで使用される仮想バイトの合計は、マシンの実際のメモリよりもかなり多くのメモリになります。
したがって、関係は次のとおりです。
- Private Bytesは、アプリが実際に割り当てたバイトですが、ページファイルの使用を含みます。
- ワーキングセットは、非ページのプライベートバイトとメモリマップファイルです。
- 仮想バイトは、ワーキングセットとページ化されたプライベートバイトおよびスタンバイリストです。
ここに別の問題があります。共有ライブラリがアプリケーションモジュール内にメモリを割り当てることができるのと同じように、アプリのプライベートバイトで誤検知が報告される可能性があるのと同様に、アプリケーションも共有モジュール内にメモリを割り当てて、falseにつながる可能性がありますネガ。つまり、アプリケーションがメモリリークを起こして、プライベートバイトにまったく現れない可能性があります。可能性は低いですが、可能です。
プライベートバイトは、実行可能ファイルが使用しているメモリ量の妥当な概算であり、メモリリークの潜在的な候補のリストを絞り込むのに役立ちます。数が絶え間なく無限に増加しているのを見た場合は、そのプロセスにリークがないか確認する必要があります。しかし、これは証明できませんリークがあるかどうかは。
Windowsでメモリリークを検出/修正するための最も効果的なツールの1つは、実際にはVisual Studioです(リンクは、製品ページではなく、VSを使用したメモリリークのページに移動します)。 Rational Purifyは別の可能性です。Microsoftには、この問題に関するより一般的なベストプラクティスドキュメントもあります。この前の質問には、より多くのツールがリストされています。
これでいくつかの問題が解決することを願っています!メモリリークを追跡することは、デバッグで行うのが最も難しいことの1つです。幸運を。