Android 內(nèi)存泄露

程序中已動態(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釋放資源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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