什么是內存泄漏和內存溢出
內存泄漏(Memory Leak):指的是程序在申請內存空間之后,無法釋放已占有的空間,雖然一兩次內存泄漏并不會對程序造成什么大的影響,但是內存泄漏的堆積會導致程序崩潰.
內存溢出(OutOfMemory):指的是程序申請內存的時候,沒有足夠的空間分配,程序便會OOM,通俗一點說,也就是程序需要的空間比系統(tǒng)可以分配的空間大,所以就溢出了.
二者關系:內存泄漏的堆積會導致內存溢出.
導致內存泄漏的根本原因是:生命周期的長的對象持有生命周期短的對象,導致短生命周期的對象不能被及時釋放,常見的導致內存泄漏的原因有:
-
單例
由于單例的生命周期和應用的生命周期一樣長,所以有些對象如果被單例對象持有引用的話,就不能被系統(tǒng)回收,從而會導致內存泄漏
-
非靜態(tài)的內部類持有外部類的引用
-
資源沒有關閉
使用了BraodcastReceiver遥缕,ContentObserver每窖,File着茸,Cursor型奥,Stream,Bitmap等資源倍靡,應該在Activity銷毀時及時關閉或者注銷猴伶,否則這些資源將不會被回收,從而造成內存泄漏
-
容器導致的內存泄漏
比如集合,我們常常會把一些對象存放在集合中,當我們不再需要的時候,應該及時的清理集合,否則集合會越來越大,在推出之前要調用clear(),再置為null
導致內存溢出的原因是內存溢出就是你要求分配的內存超出了系統(tǒng)能給你的塌西,系統(tǒng)不能滿足需求他挎,于是產生溢出,常見的原因有以下幾點:
-
一次加載的數據過于龐大,如查詢數據庫
-
代碼中存在死循環(huán)創(chuàng)建了大量的對象
-
啟動參數的內存值設置的太小
-
加載大圖片導致OOM