想要避免OOM 異常首先咱們要知道什麼狀況下會致使OOM 異常。數據庫
一、圖片過大致使OOM緩存
Android 中用bitmap 時很容易內存溢出,好比報以下錯誤:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget。
解決方法:
方法1: 等比例縮小圖片
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
//Options 只保存圖片尺寸大小,不保存圖片到內存
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 2;
Bitmap bmp = null;
bmp = BitmapFactory.decodeResource(getResources(),
mImageIds[position],opts);
//回收
bmp.recycle();
以上代碼能夠優化內存溢出,但它只是改變圖片大小,並不能完全解決內存溢出。測試
方法2:對圖片採用軟引用,及時地進行recyle()操做
SoftReference<Bitmap> bitmap = new SoftReference<Bitmap>(pBitmap);
if(bitmap != null){
if(bitmap.get() != null && !bitmap.get().isRecycled()){
bitmap.get().recycle();
bitmap = null;
}
}優化
二、Bitmap 對象再也不使用時調用recycle()釋放內存spa
有時咱們會手工的操做Bitmap 對象,若是一個Bitmap 對象比較佔內存,當它再也不被使用的時候,code
能夠調用Bitmap.recycle()方法回收此對象的像素所佔用的內存,但這不是必須的,視狀況而定。視頻
三、資源對象沒有關閉對象
資源性對象好比(Cursor,IO流等)每每都用了一些緩衝,咱們在不使用的時候,應該及時關閉它們, 以便它們的緩衝及時回收內存。生命週期
查詢數據庫沒有關閉遊標:程序中常常會進行查詢數據庫的操做,可是常常會有使用完畢Cursor 後沒有關閉的狀況。若是咱們的查詢結果集比較小,對內存的消耗不容易被發現,只有在長時間大量操做的狀況下才會出現內存問題,這樣就會給之後的測試和問題排查帶來困難和風險。圖片
四、硬件資源的釋放
Android中最典型的須要注意釋放硬件資源的狀況是在Activity 的生命週期中,在onPause()、onStop()、onDestroy()方法中
須要適當的釋放資源的狀況,這些硬件資源可能包括:視頻、音頻、相機等。
五、構造Adapter 時,沒有使用緩存的convertView
在使用ListView 的時候一般會使用Adapter,那麼咱們應該儘量的使用ConvertView。
六、避免內存泄漏致使OOM
內存泄漏會致使對象沒法回收,從而佔用系統內存,可能致使OOM,因此咱們要儘可能避免內存泄漏。