目錄
概念
Android OOM全稱Out Of Memory,即內存溢出。會發生這個現象的根本原因是由於Android系統爲了整個系統的內存控制,爲每一個應用程序都設置了一個最大內存閾值即Dalvik Heap Size,如果應用分配內存超過這個閾值時,便會發生OOM。
如果想知道某個應用的最大內存閾值,可以先獲取ActivityManager實例,再調用其getMemoryClass方法,返回單位爲MB
避免方法
爲了避免發生OOM,根本措施便是控制內存的分配,儘可能減少不必要的內存使用。具體細分爲以下四個方面
減小對象的內存使用
內存對象的重複使用
避免對象的內存泄漏
內存使用策略優化
減小對象的內存使用
- 使用更爲輕量級的數據結構,例如使用ArrayMap/SparseArray代替HashMap
- 避免在Android中使用枚舉enum
- 減小Bitmap對象的內存佔用,具體措施可以看這個減小Bitmap對象的內存佔用
- 儘可能使用更小的圖片
內存對象的重複使用
複用系統自帶的資源,例如字符串/顏色/圖片/動畫/樣式/簡單佈局等等,在符合需求的情況下直接引用這些自帶的資源,不僅可以減小應用本身APK的大小,還可以一定程度減小內存上的開銷
在listView以及GridView中注意ConvertView的重複利用,避免每次都需要調用findviewById。或者使用RecyclerView代替前面二者,因爲RecyclerView本身便存在Viewholder複用機制
Bitmap對象的複用,由於Bitmap對內存負擔很大,所以儘可能的複用
避免在onDraw方法中創建對象,因爲該方法會被調用很多次
利用StringBuffer替換+
避免對象的內存泄漏
- 使用LeakCanary開源控件監測內存泄漏情況
- 儘可能使用application context而不是activity context
- Bitmap對象的及時回收
- 監聽器的註冊與註銷,一般需要register的監聽器,都需要及時調用unregister去註銷
- webView的泄漏,由於webView本身的兼容性問題,最好爲webView單獨開啓一個進程,使用AIDL與主進程進行通信,並及時銷燬WebView所在的進程
- Cursor對象的及時關閉
內存使用策略優化
- 針對某些大內存的操作使用try catch捕獲並進行降級的內存分配
- 謹慎使用static關鍵字
- 儘可能減小布局層次,多層佈局不僅佔用內存更高,並且效率也會更低,所以儘可能減少佈局層次,業務需要的情況下可以採用自定義View
- 不要採用沒必要的抽象編程方式,抽象類本身就是一個額外的內存消耗,當它對性能提升沒有太大作用時,就避免採用這種編程方式
- 儘可能使用IntentService,它會在任務結束之後儘快結束自己內存消耗