對象優化
- 避免創建不必要對象
最常見的例子就是當你要頻繁操作一個字符串時,使用StringBuffer
代替String
。
對于所有所有基本類型的組合:int
數組比Integer
數組好,這也概括了一個基本事實,兩個平行的int
數組比 (int,int)
對象數組性能要好很多。
總體來說,就是避免創建短命的臨時對象。減少對象的創建就能減少垃圾收集,進而減少對用戶體驗的影響。
- 注意關閉或注銷
Cursor
,廣播
,File
等關閉,Service
處理完任務后應當關閉,如果不是常駐的Service,可以使用IntentService
代替。還有存在很多需要register
與unregister
的監聽器,我們需要確保在合適的時候及時unregister那些監聽器。自己手動add的listener,需要記得及時remove這個listener。
- 對象的重復利用
利用對象池將用過的對象保存起來,等下一次需要這種對象的時候,再拿出來重復使用。例如圖片緩存庫常見的,通過Lru算法
緩存常用的圖片對象,下次使用的時候從緩存中提取。
在ListView/GridView
等出現大量重復子組件的視圖里面對ConvertView
的復用。
- 對象引用類型
引用分為四種級別,這四種級別由高到低依次為:強引用>軟引用>弱引用>虛引用,根據情況使用。
- 避免在
onDraw
方法里面執行對象的創建
類似onDraw等頻繁調用的方法,一定需要注意避免在這里做創建對象的操作,因為他會迅速增加內存的使用,而且很容易引起頻繁的gc,甚至是內存抖動。
bitmap優化
內存優化中最常見的是對bitmap的處理,很多OOM
問題都是由于bitmap操作不當而產生的。
- 減小
Bitmap
對象的內存占用
Bitmap是一個極容易消耗內存的大胖子,減小創建出來的Bitmap的內存占用可謂是重中之重,通常來說有以下2個措施:
inSampleSize:縮放比例,在把圖片載入內存之前,我們可以通過BitmapOptions
讀取原圖的寬高度,然后計算出一個合適的縮放比例,避免不必要的大圖載入。
decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差異。
- .9.png
一些重復拉伸的背景,可以使用.9.png
格式,盡量把圖縮小只留一小部分區域。
- 臨時Bitmap對象的及時回收
雖然在大多數情況下,我們會對Bitmap增加緩存機制,但是在某些時候,部分Bitmap是需要及時回收的。例如臨時創建的某個相對比較大的bitmap對象,在經過變換得到新的bitmap對象之后,已經沒用的bitmap應該recycle
,這樣能夠更快釋放原始bitmap所占用的空間。
避免內存泄漏
盡量使用Application Context
而不是Activity Context
。
Activity
關閉后注意要停止Handler
的執行。
線程和static
對象使用不當也會導致對象泄漏,特別留意單例對象中不合理的持有。
優化布局
優化布局層次,減少布局嵌套和復雜度。
謹慎使用依賴注入框架,雖然代碼是簡化了不少。然而,那些注入框架會通過掃描你的代碼執行許多初始化的操作,這會導致你的代碼需要大量的內存空間來mapping代碼,而且mapped pages會長時間的被保留在內存中。除非真的很有必要,建議謹慎使用這種技術。