因爲內存泄露致使的遊戲BUG的狀況。在TestBird手遊測試平臺上的發生頻率很高,我也在此前的文章中談到過內存佔用太高會對手機中的應用形成的影響,今天咱們再深刻探討一下內存泄露的問題。算法
內存泄露是指程序中間動態分配了內存,可是在程序結束時沒有釋放這部份內存,從而形成那一部份內存不可用的狀況,重起計算機能夠解決,可是也有可能再次發生內存泄露,內存泄露和硬件沒有關係,它是由軟件設計缺陷引發的。服務器
以發生的方式來分類,內存泄漏能夠分爲4 類:函數
1.常發性內存泄漏。發生內存泄漏的代碼會被屢次執行到,每次被執行的時候都會致使一塊內存泄漏。工具
2.偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操做過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。因此測試環境和測試方法對檢測內存泄漏相當重要。性能
3.一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者因爲算法上的缺陷,致使總會有一塊僅且一塊內存發生泄漏。好比,在類的構造函數中分配內存,在析構函數中卻沒有釋放該內存,因此內存泄漏只會發生一次。測試
4.隱式內存泄漏。程序在運行過程當中不停地分配內存,可是直到結束的時候才釋放內存。嚴格的說這裏並無發生內存泄漏,由於最終程序釋放了全部申請的內存。可是對於一個服務器程序,須要運行幾天,幾周甚至幾個月,不及時釋放內存也可能致使最終耗盡系統的全部內存。因此,咱們稱這類內存泄漏爲隱式內存泄漏。優化
壓力測試過程當中針對內存泄露主要關注以下指標:設計
Memory Available Bytes 是指剩餘的可用物理內存,單位是兆字節(參考 值:>=10% )。代表進程當前可以使用的內存字節數。調試
Memory Pages/sec 是代表因爲硬件頁面錯誤而從磁盤取出的頁面數,或因爲頁面錯誤而寫入磁盤以釋放工做集空間的頁面數。遊戲
ProcessPrivate Bytes 是指當前進程中運行的私有內存,若是此內存不斷攀升,表示當前存在的內存泄漏,通常狀況若是資源合理利用的話,該指標值波動比較平穩。
有效的監控以上計數器能夠方便咱們判斷內存泄漏問題,測試人員發現此類內存泄漏現象之後就要聯繫開發人員去定位問題,再解決問題。當屢次遊戲測試後發現內存值在某個特定值之間上下波動時,範圍值爲20%左右時咱們就能夠認爲內存泄露的問題基本解決了。
從用戶使用程序的角度來看,內存泄漏自己不會產生什麼危害,做爲通常的用戶,根本感受不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最終消耗盡系統全部的內存。從這個角度來講,一次性內存泄漏並無什麼危害,由於它不會堆積,而隱式內存泄漏危害性則很是大,由於較之於常發性和偶發性內存泄漏它更難被檢測到。
其實,內存泄漏問題多半在手遊壓力測試中出現也是源於程序編寫過程當中沒有規範化管理所致使,開發人員須要結合內存監測工具來有效監控本身的程序,這樣纔會避免這些個低級的瓶頸出現,因此說手遊性能測試只是爲程序提供優化建議,而不該該成爲幫助開發人員調試遊戲的一種手段。