OOM:Out Of Memory,內存泄漏
可以從四個方面來避免OOM:首先是減小對象的內存佔用,其次是內存對象的重複利用,然後是避免對象的內存泄露,最後是內存使用策略優化。
1) 使用更加輕量的數據結構 例如,我們可以考慮使用ArrayMap/SparseArray而不是HashMap等傳統數據結構
2) 避免在Android裏面使用Enum(枚舉)
3) 減小Bitmap對象的內存佔用 Bitmap是一個極容易消耗內存的類型,注意臨時Bitmap對象的及時回收。
4) 使用更小的圖片。在設計給到資源圖片的時候,我們需要特別留意這張圖片是否存在可以壓縮的空間,是否可以使用一張更小的圖片。儘量使用更小的圖片不僅僅可以減少內存的使用,還可以避免出現大量的InflationException。假設有一張很大的圖片被XML文件直接引用,很有可能在初始化視圖的時候就會因爲內存不足而發生InflationException,這個問題的根本原因其實是發生了OOM
5) 注意在ListView/GridView等出現大量重複子組件的視圖裏面對ConvertView的複用
6) 避免在onDraw方法裏面執行對象的創建。類似onDraw等頻繁調用的方法,一定需要注意避免在這裏做創建對象的操作,因爲他會迅速增加內存的使用,而且很容易引起頻繁的gc,甚至是內存抖動。
7) 注意WebView的泄漏
8) 謹慎使用static對象。因爲static的生命週期過長,和應用的進程保持一致,使用不當很可能導致對象泄漏,在Android中應該謹慎使用static對象。
9) 特別留意單例對象中不合理的持有。雖然單例模式簡單實用,提供了很多便利性,但是因爲單例的生命週期和應用保持一致,使用不合理很容易出現持有對象的泄漏。
10) 優化佈局層次,減少內存消耗。越扁平化的視圖佈局,佔用的內存就越少,效率越高。我們需要儘量保證佈局足夠扁平化,當使用系統提供的View無法實現足夠扁平的時候考慮使用自定義View來達到目的。