天天看點

快速診斷記憶體洩漏

這一年眼看就到了盡頭。下半年我比較忙,發生了太多的事情,半年都沒寫部落格了,現在又撿起來,顯得有些生疏。值此新舊更替之際,誠摯祝願各位新老朋友在新的2012年裡萬事如意,心想事成!回首來看,以往的文章多少顯得篇幅太長,比較累贅,在新的2012年裡,我将專注面向 IT 專業人士,減少對基礎的贅述,如您有什麼不明白的地方,歡迎在文後評論留言,也可在微網誌給我發消息。

在這一年裡,是否有遺漏什麼事情呢?哈哈,也許,電腦有時候遇到了寫得不好的程式或者驅動,也會洩漏記憶體呢。今天我們就一起在2011年的最後時刻一起讨論一下如何快速檢測記憶體洩漏。

我們知道,當程式向記憶體池申請配置設定記憶體後,若不釋放,就會産生所謂的"記憶體洩漏"。這樣的後果是嚴重的:Windows會越來越慢,如果有限的記憶體池被完全耗盡,那就會發生各種錯誤和異常。當您覺得系統在啟動和登入後越來越慢時,您大緻就可以開始懷疑是否存有記憶體洩漏了。現在介紹一種能夠簡易診斷的方式,這種方式雖不能直接指出是哪個使用者态或者核心态的程式造成的記憶體洩漏,但是能夠診斷是否存有洩漏情況,我們一起來看看。

1. 啟動"性能螢幕"(perfmon);

2. 添加三個特征計數器:

父類别

計數器名稱

Memory

Pool Nonpaged Bytes

Pool Paged Bytes

Paging File

% Usage

由于記憶體洩漏一般都要數小時才能檢測到并确診,是以這個方法雖叫"快速",實際上還是比較緩慢的,但是最簡易的方式了。這裡,我建議大家将性能計數器的屬性中的采樣間隔和持續時間都設得久一些,這樣采樣點會較少,而兩個采樣點之間的資料變化也會比較明顯,容易直覺比較。

開始采樣後,您需要啟動您認為可疑的應用程式,或者幹脆就在您認為會有記憶體洩漏的現有系統環境下直接開始監測。如果您是在添加計數器後才開始啟動一些可疑程式的,那麼您會看到一個前期過程内,計數器的值會變化較大,但是,過段時間就會趨于相對穩定。那麼在穩定後的資料規律性變化則起到關鍵的判别作用。值得注意的是,在檢測期間,就不要再使用系統了,也不要對應用産生幹擾,以免造成計數器的無關變化。

這裡我給出一張對照表,可以幫助您通過穩定後的名額變化來判斷是否有記憶體洩漏:

洩漏來源

計數器名額變化規律

說明

使用者态

Pool Paged Bytes 和 page file Usage 會随時間不斷上升

使用者态程式記憶體洩漏總是發生在換頁記憶體池中

核心态

Pool Nonpaged Bytes 随時間不斷上升 (Pool Paged Bytes 也能随時間上升)

核心态記憶體洩漏通常消耗非換頁記憶體池

注意,萬一在計數點遇到應用程式緩存資料,則會造成計數器計數值的"異常",這對于我們的記憶體洩漏判斷而言将是種誤報。需根據後續的情況走勢來看。

這裡,我進行了30多分鐘的檢測,我的采樣間隔是10分鐘一次,那麼下圖中将有三次采樣的資料。可以看出,這是相對穩定的狀态,沒有記憶體洩漏。(建議您至少監測1小時以上)

如果您想搜集詳細的日志,不妨在"資料收集器"的"使用者定義"下建立一個收集器,然後您可以在一段時間後檢視報告。這樣可以有效避免實時監測視窗的記錄線條在到達右邊底部時重新從左邊開始覆寫已有資料。

好了,到這裡本文就介紹完了。如果您是專業開發人員,需要進一步檢測應用程式的使用者态/核心态記憶體洩漏情況,那就需要用更加專業的工具了,例如診斷核心态洩漏,可以使用 Driver Verifier、核心調試器和 Windows Driver Kit 裡面的 PoolMon 工具;對于使用者态記憶體洩漏診斷,可以使用 WinDbg 自帶的 UMDH 工具或者針對具體的程序添加更多的計數器… 這些都不在本文的讨論範圍内了。希望大家懷疑有記憶體洩漏時,都能通過這一簡易辦法進行确認哦~

咱2012年再見~ J

本文轉自 hbycscc 51CTO部落格,原文連結http://blog.51cto.com/mvperic/755652

繼續閱讀