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