什么是內(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)存泄漏
-
非靜態(tài)的內(nèi)部類持有外部類的引用
-
資源沒有關(guān)閉
使用了BraodcastReceiver,ContentObserver,F(xiàn)ile,Cursor,Stream,Bitmap等資源,應(yīng)該在Activity銷毀時及時關(guān)閉或者注銷,否則這些資源將不會被回收,從而造成內(nèi)存泄漏
-
容器導(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