web-dev-qa-db-ja.com

プレビューバイト、仮想バイト、ワーキングセットとは何ですか?

プロセス内のメモリリークをデバッグするためにperfmon windowsユーティリティを使用しようとしています。

これは、perfmonが用語を説明している方法です。

作業セットは、このプロセスの作業セットの現在のサイズ(バイト単位)です。ワーキングセットは、プロセス内のスレッドによって最近アクセスされたメモリページのセットです。コンピュータの空きメモリがしきい値を超えている場合、それらが使用されていなくても、ページはプロセスのワーキングセットに残ります。空きメモリがしきい値を下回ると、ページはワーキングセットから削除されます。それらが必要とされるならば、それらはそれからメインメモリを離れる前にワーキングセットにソフトフォールトされます。

仮想バイト数は、プロセスが使用している仮想アドレス空間の現在のサイズ(バイト数)です。仮想アドレス空間の使用は、必ずしもディスクページまたはメインメモリページの対応する使用を意味するわけではありません。仮想空間は有限であり、そのプロセスはライブラリをロードする能力を制限する可能性があります。

Private Bytesは、このプロセスが割り当てた現在のサイズ(バイト単位)で、他のプロセスと共有することはできません。

これらは私が持っている質問です:

共有ライブラリが関与していないためプロセスにリークがあるかどうかを確認するために測定すべきプライベートバイトであり、リークが発生した場合はプロセス自体から発生します。

プロセスによって消費される合計メモリはいくらですか。それは仮想バイトですか?それとも仮想バイトとワーキングセットの合計ですか?

Private Bytes、Working Set、Virtual Bytesの間に関係はありますか?

メモリ使用量のより良いアイデアを与える他のツールはありますか?

442
pankajt

メモリリークを判断するために、perfmon、タスクマネージャ、またはそのようなツールを使用しないでください。傾向を特定するのには役立ちますが、それ以外のことはあまりありません。彼らが絶対的な言葉で報告する数はあまりにも曖昧で集約されているので、メモリリーク検出のような特定のタスクのために役に立ちません。

この質問に対する前回の回答では、さまざまなタイプが何であるかについての素晴らしい説明がありました。

あなたはツールの推薦について尋ねます:私はMemory Validatorを推薦します。数十億のメモリ割り当てを行うアプリケーションを監視することができます。

http://www.softwareverify.com/cpp/memory/index.html

免責事項:私はMemory Validatorを設計しました。

9
Stephen Kellett

Perfmonカウンタの定義は最初から壊れており、何らかの理由で修正するのが難しすぎるようです。

Windowsのメモリ管理の概要は、MSDNのビデオ「 メモリ管理の謎 」でご覧いただけます。それはメモリリークを追跡するのに必要とされるよりも多くのトピック(例えばワーキングセット管理)をカバーしますが、関連トピックで十分な詳細を与えます。


Perfmonカウンタの説明に関する問題のヒントを与えるために、「 Private Bytes Performance Counterからのプライベートバイトについての裏話を示します - 注意してください! MSDNの) 」:

Q:プライベートバイトがプライベートバイトではないのはいつですか。

A:居住していないとき.

Private Bytesカウンタは、プロセスのコミット料金を報告します。つまり、スワップアウトされた場合にプライベートメモリの内容を保持するためにスワップファイルに割り当てられているスペースの量です。注:コミットされていない予約状態の仮想メモリと混同される可能性があるため、「予約」という単語は避けています。


MSDNの「 パフォーマンス計画 」から:

3.3プライベートバイト

3.3.1説明

プライベートメモリは、他のプロセスと共有できないプロセスに割り当てられたメモリとして定義されます。このメモリは、複数のプロセスが1つのマシン上で実行される場合、共有メモリよりも高価です。 (伝統的な)アンマネージドDLLのプライベートメモリは通常C++スタティックで構成され、DLLの全ワーキングセットの5%のオーダーです。

8
Mark

ここで興味深い議論があります。 http://social.msdn.Microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ このスレッドを理解しているということは、小さな割り当てを解放してもPrivate BytesやWorking Setには反映されないということです。

短い話:

電話したら

p=malloc(1000);
free(p);

プライベートバイトは割り当てのみを反映し、割り当て解除は反映しません。

電話したら

p=malloc(>512k);
free(p);

プライベートバイトは、割り当てと割り当て解除を正しく反映します。

5
mcanti