快速診斷內存泄漏
這一年眼看就到了盡頭。下半年我比較忙,發生了太多的事情,半年都沒寫博客了,現在又撿起來,顯得有些生疏。值此新舊更替之際,誠摯祝愿各位新老朋友在新的2012年里萬事如意,心想事成!回首來看,以往的文章多少顯得篇幅太長,比較累贅,在新的2012年里,我將專注面向 IT 專業人士,減少對基礎的贅述,如您有什么不明白的地方,歡迎在文后評論留言,也可在微博給我發消息。
在這一年里,是否有遺漏什么事情呢?哈哈,也許,電腦有時候遇到了寫得不好的程序或者驅動,也會泄漏內存呢。今天我們就一起在2011年的最后時刻一起討論一下如何快速檢測內存泄漏。
我們知道,當程序向內存池申請分配內存后,若不釋放,就會產生所謂的"內存泄漏"。這樣的后果是嚴重的:Windows會越來越慢,如果有限的內存池被完全耗盡,那就會發生各種錯誤和異常。當您覺得系統在啟動和登錄后越來越慢時,您大致就可以開始懷疑是否存有內存泄漏了。現在介紹一種能夠簡易診斷的方式,這種方式雖不能直接指出是哪個用戶態或者內核態的程序造成的內存泄漏,但是能夠診斷是否存有泄漏情況,我們一起來看看。
1. 啟動"性能監視器"(perfmon);
2. 添加三個特征計數器:
父類別 | 計數器名稱 |
Memory | Pool Nonpaged Bytes |
Memory | Pool Paged Bytes |
Paging File | % Usage |
由于內存泄漏一般都要數小時才能檢測到并確診,所以這個方法雖叫"快速",實際上還是比較緩慢的,但是最簡易的方式了。這里,我建議大家將性能計數器的屬性中的采樣間隔和持續時間都設得久一些,這樣采樣點會較少,而兩個采樣點之間的數據變化也會比較明顯,容易直觀比較。
開始采樣后,您需要啟動您認為可疑的應用程序,或者干脆就在您認為會有內存泄漏的現有系統環境下直接開始監測。如果您是在添加計數器后才開始啟動一些可疑程序的,那么您會看到一個前期過程內,計數器的值會變化較大,但是,過段時間就會趨于相對穩定。那么在穩定后的數據規律性變化則起到關鍵的判別作用。值得注意的是,在檢測期間,就不要再使用系統了,也不要對應用產生干擾,以免造成計數器的無關變化。
這里我給出一張對照表,可以幫助您通過穩定后的指標變化來判斷是否有內存泄漏:
泄漏來源 | 計數器指標變化規律 | 說明 |
用戶態 | Pool Paged Bytes 和 page file Usage 會隨時間不斷上升 | 用戶態程序內存泄漏總是發生在換頁內存池中 |
內核態 | Pool Nonpaged Bytes 隨時間不斷上升 (Pool Paged Bytes 也能隨時間上升) | 內核態內存泄漏通常消耗非換頁內存池 |
注意,萬一在計數點遇到應用程序緩存數據,則會造成計數器計數值的"異常",這對于我們的內存泄漏判斷而言將是種誤報。需根據后續的情況走勢來看。
這里,我進行了30多分鐘的檢測,我的采樣間隔是10分鐘一次,那么下圖中將有三次采樣的數據。可以看出,這是相對穩定的狀態,沒有內存泄漏。(建議您至少監測1小時以上)
注意,萬一在計數點遇到應用程序緩存數據,則會造成計數器計數值的"異常",這對于我們的內存泄漏判斷而言將是種誤報。需根據后續的情況走勢來看。
這里,我進行了30多分鐘的檢測,我的采樣間隔是10分鐘一次,那么下圖中將有三次采樣的數據。可以看出,這是相對穩定的狀態,沒有內存泄漏。(建議您至少監測1小時以上)
原文鏈接:http://www.cnblogs.com/mvperic/archive/2012/01/01/2309258.html