如何定位和解決記憶體洩露

gggggggbong發表於2016-07-27

由於記憶體洩露導致的遊戲BUG的情況。在TestBird手遊測試平臺上的發生頻率很高,我也在此前的文章中談到過記憶體佔用過高會對手機中的應用造成的影響,今天我們再深入探討一下記憶體洩露的問題。

  記憶體洩露是指程式中間動態分配了記憶體,但是在程式結束時沒有釋放這部分記憶體,從而造成那一部分記憶體不可用的情況,重起計算機可以解決,但是也有可能再次發生記憶體洩露,記憶體洩露和硬體沒有關係,它是由軟體設計缺陷引起的。

  以發生的方式來分類,記憶體洩漏可以分為4 類:

  1.常發性記憶體洩漏。發生記憶體洩漏的程式碼會被多次執行到,每次被執行的時候都會導致一塊記憶體洩漏。

  2.偶發性記憶體洩漏。發生記憶體洩漏的程式碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測記憶體洩漏至關重要。

  3.一次性記憶體洩漏。發生記憶體洩漏的程式碼只會被執行一次,或者由於演算法上的缺陷,導致總會有一塊僅且一塊記憶體發生洩漏。比如,在類的建構函式中分配記憶體,在解構函式中卻沒有釋放該記憶體,所以記憶體洩漏只會發生一次。

  4.隱式記憶體洩漏。程式在執行過程中不停地分配記憶體,但是直到結束的時候才釋放記憶體。嚴格的說這裡並沒有發生記憶體洩漏,因為最終程式釋放了所有申請的記憶體。但是對於一個伺服器程式,需要執行幾天,幾周甚至幾個月,不及時釋放記憶體也可能導致最終耗盡系統的所有記憶體。所以,我們稱這類記憶體洩漏為隱式記憶體洩漏。

壓力測試過程中針對記憶體洩露主要關注如下指標:

  Memory Available Bytes 是指剩餘的可用實體記憶體,單位是兆位元組(參考  值:>=10% )。表明程式當前可使用的記憶體位元組數。

  Memory Pages/sec 是表明由於硬體頁面錯誤而從磁碟取出的頁面數,或由於頁面錯誤而寫入磁碟以釋放工作集空間的頁面數。

  ProcessPrivate Bytes 是指當前程式中執行的私有記憶體,如果此記憶體不斷攀升,表示當前存在的記憶體洩漏,一般情況如果資源合理利用的話,該指標值波動比較平穩。

有效的監控以上計數器可以方便我們判斷記憶體洩漏問題,測試人員發現此類記憶體洩漏現象以後就要聯絡開發人員去定位問題,再解決問題。當多次遊戲測試後發現記憶體值在某個特定值之間上下波動時,範圍值為20%左右時我們就可以認為記憶體洩露的問題基本解決了。

從使用者使用程式的角度來看,記憶體洩漏本身不會產生什麼危害,作為一般的使用者,根本感覺不到記憶體洩漏的存在。真正有危害的是記憶體洩漏的堆積,這會最終消耗盡系統所有的記憶體。從這個角度來說,一次性記憶體洩漏並沒有什麼危害,因為它不會堆積,而隱式記憶體洩漏危害性則非常大,因為較之於常發性和偶發性記憶體洩漏它更難被檢測到。

其實,記憶體洩漏問題多半在手遊壓力測試中出現也是源於程式編寫過程中沒有規範化管理所導致,開發人員需要結合記憶體監測工具來有效監控自己的程式,這樣才會避免這些個低階的瓶頸出現,所以說手遊效能測試只是為程式提供優化建議,而不應該成為幫助開發人員除錯遊戲的一種手段。

相關文章