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