程序中已動態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無法釋放,造成系統(tǒng)內(nèi)存的浪費,導致程序運行速度減慢甚至系統(tǒng)崩潰等嚴重后果。
長生命周期持有短生命周期對象引用,盡管短生命周期對象已經(jīng)沒有使用,但長生命周期一直持有短生命周期引用而導致不能回收,則導致內(nèi)存泄露。
今天想去婆婆家玩,我有一個大背包,我要裝我的玩具??吹酵婢咝芪铱赡苣贸鰜硗?,放到背包里。接著看到模型,這個會拿出來但不知道會玩不,先裝進去吧。背包鼓鼓了,突然看到最最愛的挖挖機了,我肯定會玩這個,發(fā)現(xiàn)無法裝入了,目前我裝這個兩個玩具都非常重了。于是兒子去拿了便利貼,上面有綠色,黃色,紅色,分別表示喜歡程度紅是最喜歡,玩具熊貼了綠色,模型貼了黃色,挖挖機提了紅色,兒子發(fā)現(xiàn)背包裝不下了會把貼有綠的玩具熊拿出來,再裝挖挖機。我想整理下背包,我只帶一定會玩的玩具去,然后取出貼有黃色標簽模型。
背包沒有容量且很重,玩具熊對兒子來說,可能都不會拿出來占用空間,最后導致內(nèi)存泄露。但兒子很聰明對玩具標記了顏色,發(fā)現(xiàn)不能裝,取出帶有綠色玩具熊(軟引用 SoftReference內(nèi)存不夠都被回收),檢查背包黃色標簽標示(弱引用WeakReference 掃描管轄內(nèi)存時)
常見內(nèi)存溢出:
單例模式,單例往往生命周期都是整個應用生命周期,如果持有短生命周期容易出現(xiàn)內(nèi)存泄漏,如Activity
靜態(tài)變量,和application一樣生命周期,需要我們評估占據(jù)空間大小
handler持有短生命周期,特別是匿名內(nèi)部內(nèi),messagequeue持有,looper持有前者
匿名內(nèi)部類持有外部類對象,如activity里面的內(nèi)部類,如果匿名內(nèi)部類做耗時是,無法釋放外部對象
資源泄漏,數(shù)據(jù)庫沒有關(guān)閉,文件沒有關(guān)閉,bitmap沒有釋放
最好是實現(xiàn)onDestory,把需要解綁注冊的廣播解綁
第三庫傳遞一定是applicant的context
容器你裝了fragment或者view,activity持有容器對象,最好在activity銷毀是clear,不要等待垃圾回收器。
使用leakcanary+MAT工具檢查內(nèi)存
開發(fā)時一定注意在activity被fragment釋放資源