內(nèi)存泄露

常見案例

handler耗時引發(fā)的內(nèi)存泄漏

當(dāng)activity當(dāng)中存在handler接收耗時的消息時,比如我們一般在網(wǎng)絡(luò)請求切換線程時咕娄,經(jīng)常使用到handler,假設(shè)消息還沒有發(fā)送完成珊擂,但是頁面已經(jīng)被關(guān)閉圣勒,也就說activity已經(jīng)執(zhí)行了ondestroy方法。當(dāng)gc回收時摧扇,會出現(xiàn)該activity不能被回收的情況圣贸,導(dǎo)致內(nèi)存泄漏。

解決辦法:當(dāng)activity銷毀的時候扛稽,調(diào)用handler的removeCallbacksAndMessages方法吁峻,移除消息任務(wù),然后將handler對象及線程置空。

內(nèi)部類引發(fā)的內(nèi)存泄漏(當(dāng)然handler或子線程一般也作為內(nèi)部類使用)

因?yàn)閖ava當(dāng)中用含,內(nèi)部類默認(rèn)持有外部類的引用矮慕,當(dāng)外部類銷毀后,一旦gc回收該實(shí)例耕餐,發(fā)現(xiàn)內(nèi)部類持有他的引用而導(dǎo)致不能回收該實(shí)例凡傅,出現(xiàn)內(nèi)存泄漏的情況。

解決方法:將內(nèi)部類改為靜態(tài)內(nèi)部類肠缔,因?yàn)殪o態(tài)內(nèi)部類生命周期和應(yīng)用一樣長夏跷,所以當(dāng)退出程序的時候會一同回收該實(shí)例,并不會影響外部類的回收明未。

單例導(dǎo)致的內(nèi)存泄漏

因?yàn)樵谑褂脝卫臅r候槽华,經(jīng)常會傳入一個本類的上下文對象,而單例是靜態(tài)的趟妥,生命周期和application一樣長猫态,當(dāng)activity銷毀的時候,該單例持有activity的引用導(dǎo)致其不能被回收披摄,出現(xiàn)內(nèi)存泄漏亲雪。

解決方法:在使用上下文的時候,傳全局上下文疚膊。

資源未關(guān)閉

Cursor义辕,stream,database寓盗,Butterknife灌砖,broadcastreciver,bindservice傀蚌,eventBus

比如這些東西在使用完成后基显,需要進(jìn)行close或者Unbind處理,以節(jié)省內(nèi)存

Bitmap對象不在使用時調(diào)用recycle()釋放內(nèi)存

Timer計時器善炫、動畫撩幽,因?yàn)檫@些涉及耗時問題,如果activity銷毀销部,而該任務(wù)并未執(zhí)行完成摸航,會導(dǎo)致內(nèi)存泄漏,所以一般在activity中如果使用到這些耗時任務(wù)舅桩,需要在activity銷毀時酱虎,做對應(yīng)處理,比如調(diào)用timer的cancel方法擂涛,或者動畫的cancel方法并將對象置空

一些監(jiān)聽器的內(nèi)存泄漏读串,比如說我們給edittext設(shè)置輸入文字監(jiān)聽時聊记,當(dāng)監(jiān)聽到文字發(fā)生變化,我們通過獲取變化后的文字執(zhí)行了耗時任務(wù)(比如獲取到edittext里的內(nèi)容上傳服務(wù)器)恢暖,當(dāng)耗時任務(wù)未執(zhí)行完成activity銷毀了排监,會引發(fā)內(nèi)存泄漏,所以在onDestory時杰捂,取消注冊舆床,比如說editText調(diào)用removeTextChangedListener方法

Rxjava的內(nèi)存泄漏:因?yàn)閞xjava采用的是觀察者模式,當(dāng)請求到數(shù)據(jù)后會根據(jù)訂閱關(guān)系將數(shù)據(jù)發(fā)送個訂閱者嫁佳,而如果這時訂閱者已經(jīng)銷毀挨队,就會出現(xiàn)引用該對象導(dǎo)致其不能被回收的情況,出現(xiàn)內(nèi)存泄漏蒿往,rxjava2發(fā)布的時候也發(fā)現(xiàn)了這個問題盛垦,所以在回調(diào)當(dāng)中,新增加了onSubcribe回調(diào)瓤漏,同時返回了一個disposable對象腾夯,可以通過判斷disposable里的isDisposed來確定當(dāng)前的訂閱關(guān)系,如果訂閱關(guān)系中的訂閱者已經(jīng)不存在且當(dāng)前訂閱關(guān)系存在蔬充,解除訂閱關(guān)系蝶俱,并終止數(shù)據(jù)的發(fā)送。

webView引發(fā)的內(nèi)存泄漏:因?yàn)閣ebview在使用的時候一般持有activity的引用饥漫,我們一般在activity的onDestroy方法中調(diào)用mWebView.destroy();來釋放webview跷乐。如果在onDetachedFromWindow之前調(diào)用了destroy那就肯定會無法正常反注冊了,也就會導(dǎo)致內(nèi)存泄漏趾浅。所以在銷毀webview前一定要先在onDetachedFromWindow中將webview從它的父view中移除,再調(diào)用destroy方法中調(diào)用webview的destroy馒稍,我開發(fā)的時候在5.1以上的手機(jī)上發(fā)現(xiàn)這種問題比較多皿哨,因?yàn)楝F(xiàn)在5.1以下適配的比較少了,基本沒咋注意纽谒。

線程導(dǎo)致的內(nèi)存泄漏:一般使用子線程都會創(chuàng)建一個內(nèi)部類對象证膨,而創(chuàng)建線程一般執(zhí)行耗時任務(wù),所以這個內(nèi)部類默認(rèn)持有外部類的引用鼓黔,如果耗時任務(wù)在activity銷毀的時候未執(zhí)行完成央勒,會因?yàn)槌钟型獠款愐脤?dǎo)致外部類不能被回收

MVP內(nèi)存泄漏

內(nèi)存抖動:

定義:內(nèi)存抖動是由于短時間內(nèi)有大量對象創(chuàng)建和銷毀,它伴隨著頻繁的GC澳化。

gc會頻繁搶占cup資源崔步,影響UI線程執(zhí)行,會導(dǎo)致app整體卡頓

解決方案:

盡量避免在循環(huán)體內(nèi)創(chuàng)建對象缎谷,應(yīng)該把對象創(chuàng)建移到循環(huán)體外井濒。

注意自定義View的onDraw()方法會被頻繁調(diào)用,所以在這里面不應(yīng)該頻繁的創(chuàng)建對象。

當(dāng)需要大量使用Bitmap的時候瑞你,試著把它們緩存在數(shù)組中實(shí)現(xiàn)復(fù)用酪惭。

對于能夠復(fù)用的對象,同理可以使用對象池將它們緩存起來者甲。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末春感,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虏缸,更是在濱河造成了極大的恐慌鲫懒,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寇钉,死亡現(xiàn)場離奇詭異刀疙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扫倡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門谦秧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撵溃,你說我怎么就攤上這事疚鲤。” “怎么了缘挑?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵集歇,是天一觀的道長。 經(jīng)常有香客問我语淘,道長诲宇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任惶翻,我火速辦了婚禮姑蓝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吕粗。我一直安慰自己纺荧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布颅筋。 她就那樣靜靜地躺著宙暇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪议泵。 梳的紋絲不亂的頭發(fā)上占贫,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音肢簿,去河邊找鬼靶剑。 笑死蜻拨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桩引。 我是一名探鬼主播缎讼,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坑匠!你這毒婦竟也來了血崭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤厘灼,失蹤者是張志新(化名)和其女友劉穎夹纫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體设凹,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舰讹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了闪朱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片月匣。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奋姿,靈堂內(nèi)的尸體忽然破棺而出锄开,到底是詐尸還是另有隱情,我是刑警寧澤称诗,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布萍悴,位于F島的核電站,受9級特大地震影響寓免,放射性物質(zhì)發(fā)生泄漏癣诱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一袜香、第九天 我趴在偏房一處隱蔽的房頂上張望狡刘。 院中可真熱鬧,春花似錦困鸥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至艺蝴,卻和暖如春猬腰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猜敢。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工姑荷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盒延,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓鼠冕,卻偏偏與公主長得像添寺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子懈费,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容