內(nèi)存對(duì)象的泄露會(huì)導(dǎo)致不再使用的對(duì)象無(wú)法及時(shí)釋放蹭越,不僅浪費(fèi)了寶貴的內(nèi)存空間,后續(xù)要分配內(nèi)存的時(shí)候教届,空間不足造成OOM响鹃。這樣,每級(jí)的generation會(huì)變小案训,gc更加容易觸發(fā)买置,引起內(nèi)存抖動(dòng),帶來(lái)性能問(wèn)題强霎。
- 注意Activity的泄露
Activity泄露是內(nèi)存泄露最為嚴(yán)重的問(wèn)題忿项,涉及內(nèi)存多,影響面廣
兩種情形:
內(nèi)部類引用導(dǎo)致Activity的泄露
典型的是Handler導(dǎo)致的Activity泄露城舞,如果Handler中有延遲的任務(wù)或者等待執(zhí)行的任務(wù)隊(duì)列過(guò)長(zhǎng)轩触,很可能因?yàn)镠andler繼續(xù)執(zhí)行造成Activity的泄露。
引用鏈?zhǔn)荓ooper->MessageQueue->Message->handler->Activity,解決辦法是在退出UI之前執(zhí)行 remove Handler消息隊(duì)列中的消息與runnable對(duì)象家夺⊥阎或者使用Static+WeakReference的方式來(lái)判斷Handler和Activity之間存在引用關(guān)系。Activity Context被傳遞到其他實(shí)例中拉馋,可能導(dǎo)致自身被引用而發(fā)生泄露
- 考慮使用Application Context而不是Activity Context
除必須使用Activity Context的情況(Dialog的context必須是Activity),我們可以使用Application Context來(lái)避免Activity泄露
- 注意臨時(shí)Bitmap的及時(shí)回收
大多數(shù)情況下榨为,我們對(duì)Bitmap對(duì)象增加緩存機(jī)制惨好,但是有時(shí)候部分bitmap需要及時(shí)回收。比如我們臨時(shí)創(chuàng)建的摸個(gè)相對(duì)大的bitmap對(duì)象随闺,變換得到新的bitmap對(duì)象后日川,盡快回收原始的bitmap,及時(shí)釋放原來(lái)的空間。
- 注意監(jiān)聽(tīng)器的注銷
android程序里面register后要及時(shí)釋放unregister那些監(jiān)聽(tīng)器板壮,自己手動(dòng)add的listener逗鸣,要記得remove這個(gè)listener.
- 注意緩存容器的對(duì)象泄露
有時(shí)候我們?yōu)榱颂岣邔?duì)象的復(fù)用性合住,把某些對(duì)象放到緩存容器中绰精,如果這些對(duì)象沒(méi)有及時(shí)從容器中清楚,也可能導(dǎo)致內(nèi)存泄露透葛,
- 注意webview的泄露
Android不同版本對(duì)webview產(chǎn)生有很大差異笨使,較為嚴(yán)重的問(wèn)題是webview的泄露,解決辦法:為webview新開(kāi)一個(gè)線程僚害,通過(guò)AIDL與主進(jìn)程通信硫椰,根據(jù)業(yè)務(wù)的需要在合適的時(shí)機(jī)進(jìn)行銷毀,從而達(dá)到內(nèi)存的釋放萨蚕。
- 注意cursor對(duì)象是否關(guān)閉
我們?cè)趯?duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí)靶草,使用完cursor沒(méi)有及時(shí)關(guān)閉,cursor的泄露岳遥,會(huì)對(duì)內(nèi)存管理帶來(lái)負(fù)面影響