メモリリークの確認に、タスクマネージャのワーキングセットを使ってはいけない。

システムの開発時、メモリリークが疑われる場合最初にタスクマネージャでexeが使用しているメモリの量を確認する事が多いかと思います。

この際、Windows7のタスクマネージャでだと、メモリの使用量として「ワーキングセット(メモリ)」と、「メモリ(プライベートワーキングセット)」の2つが有りますが、ワーキングセットを見てメモリリークの判断を行ってはいけません。

(補足:XPだと、プライベートワーキングセットは、仮想メモリサイズと表記されます)



なぜかというと、ワーキングセットの値は、以下の特性があり該当のexeが”今使用している”メモリ量をあらわしているわけでは無いからです。

1.ワーキングセットの値は,他のプロセスと共有しているメモリ領域のサイズが含まれている
  (コード領域のメモリや、共有DLLのエリアのサイズが含まれる)
 
2.ワーキングセットの値は,使用してないけど開放されてないメモリも含まれているから
  (OSは、アロケートしたメモリが不要になったからといっても、すぐにそのメモリを開放するわけではない)



一方で、プライベートワーキングセットは、該当のプロセスが、文字通り独占的(=プライベートに)消費しているメモリ量なので、通常はこの値をウォッチするとメモリリークを判断可能です。
プライベートワーキングセットのサイズが、プロセスが使用している総メモリ量というわけでは有りませんが、プログラムでメモリの開放し忘れがあった場合は、大抵プライベートワーキングセットの領域が増加し続けていくので、通常はこの値をチェックすればOKです。


前述したように、プライベートワーキングセットの現在値は、Windows7ではタスクマネージャから確認できますが、過去の履歴の推移を見たい場合は、パフォーマンスモニタからチェックする事も可能です。

手順としては、perfmon.exeを起動し、カウンターの追加よりprocessオブジェクトの中にある、Private Bytesを指定します。


ガベージコレクション 自動的メモリ管理を構成する理論と実装

.NET&Windowsプログラマのためのデバッグテクニック徹底解説

関連記事

One Response to “メモリリークの確認に、タスクマネージャのワーキングセットを使ってはいけない。”

  1. 匿名 より:

    パフォーマンスタブに出るメモリ使用量はどちらの合計ですか?

匿名 へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。