Android內(nèi)存泄漏和內(nèi)存溢出詳解

什么是內(nèi)存泄漏和內(nèi)存溢出

內(nèi)存泄漏(Memory Leak):指的是程序在申請內(nèi)存空間之后,無法釋放已占有的空間,雖然一兩次內(nèi)存泄漏并不會對程序造成什么大的影響,但是內(nèi)存泄漏的堆積會導(dǎo)致程序崩潰.

內(nèi)存溢出(OutOfMemory):指的是程序申請內(nèi)存的時候,沒有足夠的空間分配,程序便會OOM,通俗一點(diǎn)說,也就是程序需要的空間比系統(tǒng)可以分配的空間大,所以就溢出了.

二者關(guān)系:內(nèi)存泄漏的堆積會導(dǎo)致內(nèi)存溢出.

導(dǎo)致內(nèi)存泄漏的根本原因是:生命周期的長的對象持有生命周期短的對象,導(dǎo)致短生命周期的對象不能被及時釋放,常見的導(dǎo)致內(nèi)存泄漏的原因有:

  • 單例
由于單例的生命周期和應(yīng)用的生命周期一樣長,所以有些對象如果被單例對象持有引用的話,就不能被系統(tǒng)回收,從而會導(dǎo)致內(nèi)存泄漏
  1. 非靜態(tài)的內(nèi)部類持有外部類的引用
  2. 資源沒有關(guān)閉
使用了BraodcastReceiver,ContentObserver,F(xiàn)ile,Cursor,Stream,Bitmap等資源,應(yīng)該在Activity銷毀時及時關(guān)閉或者注銷,否則這些資源將不會被回收,從而造成內(nèi)存泄漏
  1. 容器導(dǎo)致的內(nèi)存泄漏
比如集合,我們常常會把一些對象存放在集合中,當(dāng)我們不再需要的時候,應(yīng)該及時的清理集合,否則集合會越來越大,在推出之前要調(diào)用clear(),再置為null

導(dǎo)致內(nèi)存溢出的原因是內(nèi)存溢出就是你要求分配的內(nèi)存超出了系統(tǒng)能給你的,系統(tǒng)不能滿足需求,于是產(chǎn)生溢出,常見的原因有以下幾點(diǎn):

  • 一次加載的數(shù)據(jù)過于龐大,如查詢數(shù)據(jù)庫
  • 代碼中存在死循環(huán)創(chuàng)建了大量的對象
  • 啟動參數(shù)的內(nèi)存值設(shè)置的太小
  • 加載大圖片導(dǎo)致OOM
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容