快速診斷內存泄漏


一年眼看就到了盡頭。下半年我比較忙,發生了太多的事情,半年都沒寫博客了,現在又撿起來,顯得有些生疏。值此新舊更替之際,誠摯祝願各位新老朋友在新的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小時以上)

 

 

如果您想搜集詳細的日志,不妨在"數據收集器"的"用戶定義"下創建一個收集器,然后您可以在一段時間后查看報告。這樣可以有效避免實時監測窗口的記錄線條在到達右邊底部時重新從左邊開始覆蓋已有數據。

 

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

 

咱2012年再見~ J


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM