Android中常見的內(nèi)存泄漏問(wèn)題總結(jié)

檢測(cè)內(nèi)存泄漏的工具有LeakCanary熬尺、MAT等工具摸屠。

一、內(nèi)存泄漏的原因:

當(dāng)一個(gè)對(duì)象已經(jīng)不需要使用粱哼,本該被回收季二,而另一個(gè)正在使用的對(duì)象持有它的引用,導(dǎo)致不能被回收揭措,而停留在堆內(nèi)存中胯舷,產(chǎn)生了內(nèi)存泄漏。通常是Activity或者Fragment的泄露绊含。

二桑嘶、內(nèi)存泄漏對(duì)程序的影響:

內(nèi)存泄漏是造成應(yīng)用程序OOM的主要原因之一。系統(tǒng)為每個(gè)應(yīng)用程序分配的內(nèi)存有限躬充,當(dāng)一個(gè)應(yīng)用中產(chǎn)生的內(nèi)存泄漏比較多時(shí)逃顶,難免會(huì)導(dǎo)致應(yīng)用所需要的內(nèi)存超過(guò)系統(tǒng)分配的內(nèi)存限額,造成內(nèi)存溢出而導(dǎo)致crash充甚。

三以政、常見的內(nèi)存泄漏:

1、單例造成的內(nèi)存泄漏

由于單例的靜態(tài)特性使得單例的生命周期和應(yīng)用的生命周期一樣長(zhǎng)津坑,如果一個(gè)對(duì)象已經(jīng)不使用妙蔗,而單例對(duì)象還持有該對(duì)象的引用,導(dǎo)致不能正常被回收疆瑰,發(fā)生內(nèi)存泄漏眉反。


由于需要傳入Context,這個(gè)Context的生命周期長(zhǎng)短至關(guān)重要穆役。

1)寸五、傳入的是Application的Context,這將沒(méi)有任何問(wèn)題耿币,因?yàn)閱卫纳芷诤虯pplication的一樣長(zhǎng)梳杏。

2)、傳入的是Activity的Context淹接。當(dāng)這個(gè)Context所對(duì)應(yīng)的Activity退出時(shí)十性,由于該Context和Activity的生命周期一樣長(zhǎng),當(dāng)前的Activity退出時(shí)它的內(nèi)存并不會(huì)被回收塑悼,因?yàn)閱卫龑?duì)象持有該Activity的引用劲适。

正確的單例應(yīng)用:

不管傳入什么Context最終使用的Application的Context。

2厢蒜、非靜態(tài)內(nèi)部類創(chuàng)建靜態(tài)實(shí)例造成的內(nèi)存泄漏霞势。


非靜態(tài)內(nèi)部類默認(rèn)會(huì)持有外部類的引用烹植,而又使用該非靜態(tài)內(nèi)部類創(chuàng)建了一個(gè)靜態(tài)的實(shí)例,該實(shí)例的生命周期和應(yīng)用一樣長(zhǎng)愕贡,導(dǎo)致該靜態(tài)實(shí)例會(huì)一直持有該Activity的引用草雕,導(dǎo)致Activity的內(nèi)存資源不能正常回收固以。

正確的做法是:將該內(nèi)部類設(shè)為靜態(tài)內(nèi)部類或?qū)⒃搩?nèi)部類變成一個(gè)單例墩虹。

3、Handler造成的內(nèi)存泄漏嘴纺。


由于mHandler是Handler的非靜態(tài)匿名內(nèi)部類的實(shí)例败晴。所以它持有外部類Activity的引用。消息隊(duì)列是在一個(gè)Looper線程中不斷輪詢處理消息栽渴,當(dāng)這個(gè)Activity退出時(shí)消息隊(duì)列中還有未處理的消息或者正在處理的消息尖坤,而消息隊(duì)列中的Message持有mHandler實(shí)例的引用,mHandler又持有Activity的引用闲擦,導(dǎo)致該Activity的內(nèi)存資源無(wú)法及時(shí)回收慢味。

正確的做法是:

創(chuàng)建一個(gè)靜態(tài)Handler內(nèi)部類,然后對(duì)Handler持有的對(duì)象使用弱引用墅冷,這樣在回收時(shí)也可以回收Handler持有的對(duì)象纯路。在Activity的Destroy時(shí)或者Stop時(shí)應(yīng)該移除消息隊(duì)列中的消息。使用mHandler.removeCallbacksAndMessages(null);是移除消息隊(duì)列中所有消息和所有的Runnable寞忿。當(dāng)然也可以使用mHandler.removeCallbacks();或mHandler.removeMessages();來(lái)移除指定的Runnable和Message驰唬。

4、線程造成的內(nèi)存泄漏腔彰。


上訴都是匿名內(nèi)部類叫编,對(duì)當(dāng)前Activity都有一個(gè)隱式引用。如果在Activity銷毀之前霹抛,任務(wù)還未完成搓逾,那么將導(dǎo)致Activity的內(nèi)存資源無(wú)法回收,造成內(nèi)存泄漏杯拐。

正確做法還是使用靜態(tài)內(nèi)部類的方式霞篡。

5、資源未關(guān)閉造成的內(nèi)存泄漏端逼。

對(duì)于使用BroadcastReceiver朗兵、ContentObserver、File顶滩、Cursor矛市、Stream、Bitmap等诲祸,應(yīng)該在Activity銷毀時(shí)及時(shí)關(guān)閉或者注銷浊吏,否則這些資源不會(huì)被回收,造成內(nèi)存泄漏救氯。

6找田、靜態(tài)的View

有時(shí),當(dāng)一個(gè)Activity經(jīng)常啟動(dòng)着憨,但是對(duì)應(yīng)的View讀取非常耗時(shí)墩衙,我們可以通過(guò)靜態(tài)View變量來(lái)保持對(duì)該Activity的rootView引用。這樣就可以不用每次啟動(dòng)Activity都去讀取并渲染View了甲抖。這確實(shí)是一個(gè)提高Activity啟動(dòng)速度的好方法漆改!但是要注意,一旦View attach到我們的Window上准谚,就會(huì)持有一個(gè)Context(即Activity)的引用挫剑。而我們的View有事一個(gè)靜態(tài)變量,所以導(dǎo)致Activity不被回收柱衔。

解決辦法:

??在使用靜態(tài)View時(shí)樊破,需要確保在資源回收時(shí),將靜態(tài)View detach掉唆铐。

7哲戚、監(jiān)聽器(各種需要注冊(cè)的Listener,Watcher等)

例如:EditText的一個(gè)addTextChangeListener艾岂,如果在回調(diào)方法里有耗時(shí)操作顺少,可能會(huì)造成內(nèi)存泄露。

解決辦法:

在onDestory時(shí)王浴,取消注冊(cè)脆炎,editText.removeTextChangedListener。

8叼耙、屬性動(dòng)畫

在使用ValueAnimator或者ObjectAnimator腕窥,如果沒(méi)有及時(shí)做cancel取消動(dòng)畫,就可能造成內(nèi)存泄漏筛婉。

解決辦法:在onDestory()調(diào)用動(dòng)畫的cancel()方法簇爆。cancel()方法最后調(diào)用了endAnimation()。

9爽撒、RxJava

在使用RxJava入蛆,如果發(fā)布一個(gè)訂閱后,由于沒(méi)有及時(shí)取消硕勿,導(dǎo)致Activity/Fragment無(wú)法銷毀哨毁,導(dǎo)致內(nèi)存泄漏源武。

解決方法:Android架構(gòu)中添加AutoDispose解決RxJava內(nèi)存泄漏

https://blog.csdn.net/mq2553299/article/details/79418068

10扼褪、WebView

在Android5.1及以上版本,webView可能存在內(nèi)存泄漏话浇。

解決辦法:在銷毀webview前一定要onDetachedFromWindow。先將webview從它的父view中移除再調(diào)用onDestory方法


Android5.1WebView內(nèi)存泄漏及解決:https://blog.csdn.net/u013085697/article/details/53259116

11幔崖、其他系統(tǒng)控件以及自定義View

在 Android Lollipop 之前使用 AlertDialog 可能會(huì)導(dǎo)致內(nèi)存泄漏:

https://blog.csdn.net/u012464435/article/details/50774580

Dialog和DialogFragment在Android5.0以下的內(nèi)存泄漏:

https://www.cnblogs.com/endure/p/7664320.html

View的post方法導(dǎo)致的內(nèi)存泄漏:

http://www.mamicode.com/info-detail-1753936.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末食店,一起剝皮案震驚了整個(gè)濱河市赏寇,隨后出現(xiàn)的幾起案子吉嫩,更是在濱河造成了極大的恐慌嗅定,老刑警劉巖自娩,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異露戒,居然都是意外死亡椒功,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門动漾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荠锭,“玉大人旱眯,你說(shuō)我怎么就攤上這事证九。” “怎么了愧怜?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拥坛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)猜惋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任著摔,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘私股。我一直安慰自己,他們只是感情好庇茫,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布螃成。 她就那樣靜靜地躺著,像睡著了一般寸宏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氮凝,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天望忆,我揣著相機(jī)與錄音罩阵,去河邊找鬼启摄。 笑死稿壁,一個(gè)胖子當(dāng)著我的面吹牛歉备,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蕾羊,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼龟再!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起利凑,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梳侨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體走哺,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哲虾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年择示,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晒旅。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谈秫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拟烫,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布硕淑,位于F島的核電站,受9級(jí)特大地震影響置媳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拇囊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一赃份、第九天 我趴在偏房一處隱蔽的房頂上張望寂拆。 院中可真熱鬧抓韩,春花似錦纠永、人聲如沸谒拴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至苍日,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間相恃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留见剩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓苍苞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親羹呵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359