共用方式為


範例 9:偵測集區記憶體流失

下列範例會使用 GFlags 在登錄中設定全系統 啟用集區標記 旗標。 然後,它會使用 PoolMon (poolmon.exe) ,這是 Windows 驅動程式套件中的工具,以顯示記憶體集區的大小。

PoolMon 會監視分頁和非分頁式記憶體集區中的位元組,並依集區標籤加以排序。 您可以定期執行 PoolMon,以識別隨著時間持續擴充的集區。 此模式通常表示記憶體流失。

注意 集區標記會在 Windows Server 2003 和更新版本的 Windows 中永久啟用。 在這些系統上,[全域旗標] 對話方塊上的 [啟用集區標記] 核取方塊會變暗,而且啟用或停用集區標記的命令會失敗。 如果未啟用集區標記,PoolMon 會失敗並顯示下列訊息:「查詢集區標記失敗 c0000002」。

偵測集區記憶體流失

  1. 若要為 Windows Server 2003 之前的 Windows 版本中的所有進程啟用集區標記,請在登錄中設定全系統 啟用集區標記 旗標。 下列命令列使用旗標縮寫方法,但您可以透過其十六進位值來識別旗標,或使用 [全域旗標] 對話方塊:

    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. 清除 [啟用集區標記 ] 旗標。

    下列命令列使用旗標縮寫方法,但您可以透過其十六進位值來識別旗標,或使用 [全域旗標] 對話方塊:

    gflags /r -ptg 
    
  5. 重新開機 Windows,讓登錄變更生效。

注意 使用附加符號 (>>) 將 PoolMon 輸出重新導向至記錄檔。 稍後,您可以檢查集區大小趨勢的記錄檔。 例如:

poolmon.exe /b >> poolmon.log