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