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