例 9: プール メモリ リークを検出する
次の例では、GFlags を使用してレジストリにシステム全体のプール タグ付けを有効にするフラグを設定します。 次に、Windows Driver Kit のツール PoolMon (poolmon.exe) を使用して、メモリ プールのサイズを表示します。
PoolMon は、ページ メモリ プールと非ページ メモリ プール内のバイトを監視し、プール タグで並べ替えます。 PoolMon を定期的に実行すると、時間の経過とともに拡張し続けるプールを特定できます。 このパターンは多くの場合、メモリ リークを示しています。
注 プール タグ付けは、Windows Server 2003 以降のバージョンの Windows で永続的に有効になります。 これらのシステムでは、[グローバル フラグ] ダイアログ ボックスの [プールのタグ付けを有効にする] チェック ボックスは淡色表示になり、プールのタグ付けを有効または無効にするコマンドは実行できません。 プール タグ付けが有効になっていない場合、PoolMon が失敗し、"Query pooltags Failed c0000002" というメッセージが表示されます。
プール メモリ リークを検出するには
Windows Server 2003 より前のバージョンの Windows ですべてのプロセスに対してプール タグ付けを有効にするには、レジストリでシステム全体のプール タグ付けを有効にするフラグを設定します。 次のコマンド ラインではフラグ省略形メソッドを使用しますが、フラグを 16 進値で識別したり、[グローバル フラグ] ダイアログ ボックスを使用したりできます。
gflags /r +ptg
レジストリの変更を有効にするには、コンピューターを再起動します。
次のコマンドを使用して、PoolMon を定期的に実行します。 このコマンドでは、/b パラメーターを使用してサイズ降順でプールを並べ替えます。
poolmon /b
これに対して、PoolMon は、割り当て操作の数や解放操作の数、プール内の残メモリ量 ([バイト] 列) など、サイズ降順でメモリ プールからの割り当てを表示します。
Memory: 16224K Avail: 4564K PageFlts: 31 InRam Krnl: 684K P: 680K Commit: 24140K Limit: 24952K Peak: 24932K Pool N: 744K P: 2180K Tag Type Allocs Frees Diff Bytes Per Alloc ----------------------------------------------------------------------- CM Paged 1283 ( 0) 1002 ( 0) 281 1377312 ( 0) 4901 Strg Paged 10385 ( 10) 6658 ( 4) 3727 317952 ( 512) 85 Fat Paged 6662 ( 8) 4971 ( 6) 1691 174560 ( 128) 103 MmSt Paged 614 ( 0) 441 ( 0) 173 83456 ( 0) 482
割り当ての [バイト] 列の値が明確な理由なく拡張し続ける場合は、そのプールにメモリ リークが発生している可能性があります。
プール タグ付けを有効にするフラグをクリアします。
次のコマンド ラインではフラグ省略形メソッドを使用しますが、フラグを 16 進値で識別したり、[グローバル フラグ] ダイアログ ボックスを使用したりできます。
gflags /r -ptg
レジストリの変更を有効にするには、Windows を再起動します。
注 追加記号 (>>) を使用して、PoolMon の出力をログ ファイルにリダイレクトします。 後からログ ファイルでプール サイズの傾向を調べることができます。 次に例を示します。
poolmon.exe /b >> poolmon.log