次の方法で共有


例 9: プール メモリ リークを検出する

次の例では、GFlags を使用してレジストリにシステム全体のプール タグ付けを有効にするフラグを設定します。 次に、Windows Driver Kit のツール PoolMon (poolmon.exe) を使用して、メモリ プールのサイズを表示します。

PoolMon は、ページ メモリ プールと非ページ メモリ プール内のバイトを監視し、プール タグで並べ替えます。 PoolMon を定期的に実行すると、時間の経過とともに拡張し続けるプールを特定できます。 このパターンは多くの場合、メモリ リークを示しています。

プール タグ付けは、Windows Server 2003 以降のバージョンの Windows で永続的に有効になります。 これらのシステムでは、[グローバル フラグ] ダイアログ ボックスの [プールのタグ付けを有効にする] チェック ボックスは淡色表示になり、プールのタグ付けを有効または無効にするコマンドは実行できません。 プール タグ付けが有効になっていない場合、PoolMon が失敗し、"Query pooltags Failed c0000002" というメッセージが表示されます。

プール メモリ リークを検出するには

  1. Windows Server 2003 より前のバージョンの Windows ですべてのプロセスに対してプール タグ付けを有効にするには、レジストリでシステム全体のプール タグ付けを有効にするフラグを設定します。 次のコマンド ラインではフラグ省略形メソッドを使用しますが、フラグを 16 進値で識別したり、[グローバル フラグ] ダイアログ ボックスを使用したりできます。

    gflags /r +ptg 
    
  2. レジストリの変更を有効にするには、コンピューターを再起動します。

  3. 次のコマンドを使用して、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
    

    割り当ての [バイト] 列の値が明確な理由なく拡張し続ける場合は、そのプールにメモリ リークが発生している可能性があります。

  4. プール タグ付けを有効にするフラグをクリアします。

    次のコマンド ラインではフラグ省略形メソッドを使用しますが、フラグを 16 進値で識別したり、[グローバル フラグ] ダイアログ ボックスを使用したりできます。

    gflags /r -ptg 
    
  5. レジストリの変更を有効にするには、Windows を再起動します。

追加記号 (>>) を使用して、PoolMon の出力をログ ファイルにリダイレクトします。 後からログ ファイルでプール サイズの傾向を調べることができます。 次に例を示します。

poolmon.exe /b >> poolmon.log