防止內存泄漏指導文檔

1. 概述程序員

 

 防止內存泄漏是一個體系工程,須要從事前預防、事中檢測、過後補救三個方面對內存問題進行梳理和處理。算法

 事前預防是指在設計階段、編碼階段就開展的預防內存泄漏的活動。編程

 設計階段主要從模塊設計、算法構建角度,儘量避免對內存頻繁的構建-釋放,儘量複用已構建好的對象。緩存

 編碼階段則需注意養成良好的編程習慣,在使用完對象後儘早地顯示地釋放對象,同時配合代碼Review機制,代碼Reviewer審覈待提交的代碼,儘量從中找出問題,而後打回本次提交記錄,讓代碼提交人完善代碼後再從新提交,再次進入新一輪的代碼Review過程,同時在這不斷反覆的過程當中,代碼提交人對相關代碼問題的認識和意識會不斷加強,後續再犯此類問題的機率會大爲下降。工具

 實踐和數據證實,在編碼階段發現和修復問題的數量、難易度、成本是有優點的。在測試階段、運營階段發現問題再修復問題的成本是高昂的。測試

 事中檢測是指在應用發佈上線後,經過在線檢測相關的系統信息,提早預判是否有內存問題發生的可能,這是基於一種預測技術的預防機制。優化

 過後補救是指在內存問題發生後,經過問題描述、工具輔助以定位和修復問題。編碼

 此外,內存優化是一個持續漸進的過程。spa

 

 

2.事前預防設計

可採用5R原則來指導事前預防的工做,5R內容爲:

  • Reckon(估算)

本條原則意爲估算應用所需的內存大小在什麼量級,以作到知己知彼,在後續使用內存時作到量入爲出。

  • Reduce(減小內存分配及使用)

該原則意爲使用分配內存時,儘可能少地分配內存空間,好比分配一個循環計數整型變量i,能用short的就不要用int

  • Reuse(重用)

本條原則意爲儘可能複用內存,一則可減小內存分配空間,二來可提升程序運行效率,體現該條原則的例子是圖片緩存。

  • Recycle(及時回收)

本條原則意爲在資源再也不使用時,要儘快釋放所佔用的資源,體現該條原則的例子是Bitmaprecyclecursorclose

  • Review(代碼Review)

提交代碼前review下本身的代碼,以發現使用不規範的地方,以及代碼提交到Gerrit後,其餘程序員協助review的過程。

5R原則只是一個指導原則,用以訓練程序員養成良好的編程習慣,在編碼過程當中,避免常見的內存泄漏類型。


在本項目中,常常出現的的內存泄漏類型以下:

  • Handler泄漏

  • static成員泄漏

  • Callback泄漏

  • Bitmap未即時釋放

  • Activity leak window

  • cursor未關閉

在代碼Review階段,可重點留意這些方面的內存問題。

 

 

3.事中監測

藉助一種收集系統運行過程產生的信息,動態分析應用是否會產生內存問題的技術,本文檔不對這種技術作討論。

 

 

4.過後補救

      在內存問題發生後,經過現場反饋的信息及內存分析工具的協助,以最終定位問題的過程。

      經常使用內存分析工具備Android MonitorDDMSMAT

相關文章
相關標籤/搜索