程序中已動態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無法釋放男窟,造成系統(tǒng)內(nèi)存的浪費碎节,導(dǎo)致程序運行速度減慢甚至系統(tǒng)崩潰等嚴重后果极景。
長生命周期持有短生命周期對象引用雷恃,盡管短生命周期對象已經(jīng)沒有使用,但長生命周期一直持有短生命周期引用而導(dǎo)致不能回收根资,則導(dǎo)致內(nèi)存泄露都许。
今天想去婆婆家玩,我有一個大背包嫂冻,我要裝我的玩具∪担看到玩具熊我可能拿出來玩桨仿,放到背包里。接著看到模型案狠,這個會拿出來但不知道會玩不服傍,先裝進去吧。背包鼓鼓了骂铁,突然看到最最愛的挖挖機了吹零,我肯定會玩這個,發(fā)現(xiàn)無法裝入了拉庵,目前我裝這個兩個玩具都非常重了灿椅。于是兒子去拿了便利貼,上面有綠色,黃色茫蛹,紅色操刀,分別表示喜歡程度紅是最喜歡,玩具熊貼了綠色婴洼,模型貼了黃色骨坑,挖挖機提了紅色,兒子發(fā)現(xiàn)背包裝不下了會把貼有綠的玩具熊拿出來柬采,再裝挖挖機欢唾。我想整理下背包,我只帶一定會玩的玩具去粉捻,然后取出貼有黃色標簽?zāi)P汀?/p>
背包沒有容量且很重礁遣,玩具熊對兒子來說,可能都不會拿出來占用空間杀迹,最后導(dǎo)致內(nèi)存泄露亡脸。但兒子很聰明對玩具標記了顏色,發(fā)現(xiàn)不能裝树酪,取出帶有綠色玩具熊(軟引用 SoftReference內(nèi)存不夠都被回收)浅碾,檢查背包黃色標簽標示(弱引用WeakReference 掃描管轄內(nèi)存時)
常見內(nèi)存溢出:
單例模式,單例往往生命周期都是整個應(yīng)用生命周期续语,如果持有短生命周期容易出現(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釋放資源