關于內存泄漏,相信大家都不陌生,壓力測試中經常會出現,本人最近在做
一個壓力測試中就著實體會了一下,上來分享分享。
內存泄露是指程序中間動態分配了內存,但是在程序結束時沒有釋放這部分
內存,從而造成那一部分內存不可用的情況,重起計算機可以解決,但是也有可
能再次發生內存泄露,內存泄露和硬件沒有關系,它是由軟件設計缺陷引起的。
以發生的方式來分類,內存泄漏可以分為4 類:
1.常發性內存泄漏。發生內存泄漏的代碼會被多次執行到,每次被執行的時
候都會導致一塊內存泄漏。
2.偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操作過程下
才會發生。常發性和偶發性是相對的。對于特定的環境,偶發性的也許就變成了
常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。
3.一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者由于算法上
的缺陷,導致總會有一塊僅且一塊內存發生泄漏。比如,在類的構造函數中分配
內存,在析構函數中卻沒有釋放該內存,所以內存泄漏只會發生一次。
4.隱式內存泄漏。程序在運行過程中不停的分配內存,但是直到結束的時候
才釋放內存。嚴格的說這里并沒有發生內存泄漏,因為最終程序釋放了所有申請
的內存。但是對于一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋
放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏為隱式
內存泄漏。
本人最近就在對一個Http應用進行壓力測試,發現被測試的對象進程在并發
100 時內存占用達到20% ,當壓力到達1000的時候,內存就持續上升,達到60% ,
最后壓力結束后,內存仍舊停留在60% 的使用率,然后重啟了系統發現內存已經
恢復了正常,于是在第二輪測試時再次不斷加壓,同時關注性能計數器中的如下
指標:
Memory\ Available Bytes 是指剩余的可用物理內存,單位是兆字節(參考
值:>=10% )。表明進程當前可使用的內存字節數。
Memory\ Pages/sec 是表明由于硬件頁面錯誤而從磁盤取出的頁面數,或由
于頁面錯誤而寫入磁盤以釋放工作集空間的頁面數。
Process\Private Bytes 是指當前進程中運行的私有內存,如果此內存不斷
攀升,表示當前存在的內存泄漏,一般情況如果資源合理利用的話,該指標值波
動比較平穩。
通過有效的監控以上計數器可以方便我們判斷內存泄漏問題,同時需要開發
人員配合進行內存查找,定位分析哪些程序存在內存泄漏。最后通過開發人員的
調試,問題很快定位了,確實有程序沒有釋放內存,最后再次施壓的結果是內存
持續在一個值上下波動,一般參考值在20% 左右,不過這個根據具體的內存空間
來定,當然如果可以更小最好了,表明內存合理利用和分配。當然了,檢測內存
泄漏的方式很多,LoadRunner施壓是可以結合響應時間的曲線圖來監控也可。
從用戶使用程序的角度來看,內存泄漏本身不會產生什么危害,作為一般的
用戶,根本感覺不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最
終消耗盡系統所有的內存。從這個角度來說,一次性內存泄漏并沒有什么危害,
因為它不會堆積,而隱式內存泄漏危害性則非常大,因為較之于常發性和偶發性
內存泄漏它更難被檢測到。對于開發人員來說,熟悉java、C++ 等應該都了解,
通常我們定義一些變量,或者實例化一些對象,比較常用就是new 方法,然后通
過delete方法進行銷毀,如果定義的東西比較多了,也就是想一天申請的內存空
間就多了,如果一旦沒有合理的管理和消化,就會忘記最后做一些內存回收的處
理,導致一些變量和實例對象沒有處理掉,最后在程序運行一段時間之后就發現
我們的內存不斷在攀升,長時間下來積累了就占用了大量的內存空間,導致其他
進程無法獲取到內存資源,無法去處理其他應用,最后服務就shut down ,等等
之類情況都比較多見,不過這些也基本取決于開發人員的經驗所致,在程序編寫
過程中合理的使用和管理內存是非常重要的,因為此類問題一般只有在性能測試
中體現出來,功能測試是完全沒有表現的跡象。
其實,內存泄漏問題多半在壓力測試中出現也是源于程序編寫過程中沒有規
范化管理所導致,開發人員需要結合內存監測工具來有效監控自己的程序,這樣
才會避免這些個低級的瓶頸出現,所以說性能測試只是為程序提供優化建議,而
不應該成為幫助開發人員調試程序的一種手段。
文章來源于領測軟件測試網 http://www.k11sc111.com/