範例 9:偵測集區記憶體流失
下列範例會使用 GFlags 在登錄中設定全系統 啟用集區標記 旗標。 然後,它會使用 PoolMon (poolmon.exe) ,這是 Windows 驅動程式套件中的工具,以顯示記憶體集區的大小。
PoolMon 會監視分頁和非分頁式記憶體集區中的位元組,並依集區標籤加以排序。 您可以定期執行 PoolMon,以識別隨著時間持續擴充的集區。 此模式通常表示記憶體流失。
注意 集區標記會在 Windows Server 2003 和更新版本的 Windows 中永久啟用。 在這些系統上,[全域旗標] 對話方塊上的 [啟用集區標記] 核取方塊會變暗,而且啟用或停用集區標記的命令會失敗。 如果未啟用集區標記,PoolMon 會失敗並顯示下列訊息:「查詢集區標記失敗 c0000002」。
偵測集區記憶體流失
若要為 Windows Server 2003 之前的 Windows 版本中的所有進程啟用集區標記,請在登錄中設定全系統 啟用集區標記 旗標。 下列命令列使用旗標縮寫方法,但您可以透過其十六進位值來識別旗標,或使用 [全域旗標] 對話方塊:
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
如果 [ 位元組 ] 資料行中的值因為沒有明顯的原因而持續擴充,該集區中可能會發生記憶體流失。
清除 [啟用集區標記 ] 旗標。
下列命令列使用旗標縮寫方法,但您可以透過其十六進位值來識別旗標,或使用 [全域旗標] 對話方塊:
gflags /r -ptg
重新開機 Windows,讓登錄變更生效。
注意 使用附加符號 (>>) 將 PoolMon 輸出重新導向至記錄檔。 稍後,您可以檢查集區大小趨勢的記錄檔。 例如:
poolmon.exe /b >> poolmon.log