一::內(nèi)存溢出(out of memory)和內(nèi)存泄漏(memory leak)的區(qū)別
內(nèi)存溢出:應(yīng)用所需要的內(nèi)存超過系統(tǒng)分配的內(nèi)存限額,就會(huì)出現(xiàn)oom。
內(nèi)存泄漏:對(duì)象無法正?;厥?,就會(huì)造成內(nèi)存泄漏,當(dāng)內(nèi)存泄漏過多時(shí),會(huì)造成內(nèi)存溢出。
要避免內(nèi)存溢出,主要是防止內(nèi)存泄漏,可以從以下幾個(gè)方面來處理:
1:控制圖片的大小,壓縮圖片,顯示縮略圖的時(shí)候,不要請(qǐng)求網(wǎng)絡(luò)顯示大圖,比喻,在recycleview滑動(dòng)的時(shí)候,顯示縮略圖,
等滑動(dòng)結(jié)束,再請(qǐng)求網(wǎng)絡(luò)顯示大圖。
2:及時(shí)釋放對(duì)象,比喻bitmap,list這些。
// Bitmap對(duì)象沒有被回收
if (!bitmapObject.isRecyled()) {
// 釋放
bitmapObject.recycle();
// 提醒系統(tǒng)及時(shí)回收
System.gc();
}
//釋放objectList
objectList.clear();
objectList=null;
3:頁(yè)面關(guān)閉的時(shí)候資源要關(guān)閉
廣播broadcastreceiver需要注銷注冊(cè)u(píng)nregisterReceiver();
文件流File:記得關(guān)閉流InputStream / OutputStream.close();
對(duì)于圖片資源Bitmap:當(dāng)它不再被使用時(shí),應(yīng)調(diào)用recycle()回收此對(duì)象的像素所占用的內(nèi)存,再賦為null
在Activity中onDestroy去調(diào)用objectAnimator.cancel()來停止動(dòng)畫。
還有一些第三方的比喻eventbus,也需要在ondestroy里注銷。
這些資源不關(guān)閉,在activity關(guān)閉的時(shí)候,頁(yè)面沒有被回收,會(huì)造成內(nèi)存泄漏。
4:context盡量使用application的context
比喻單例,如果單例中傳入的是activity的context,在activity關(guān)閉后,不會(huì)被回收,因?yàn)閱卫锩娉钟衋ctivity的context