1.非靜態(tài)內(nèi)部類的靜態(tài)實(shí)例
非靜態(tài)內(nèi)部類會(huì)持有外部類的引用丰涉,如果非靜態(tài)內(nèi)部類的實(shí)例是靜態(tài)的褂乍,就會(huì)長(zhǎng)期的維持著外部類的引用帖渠,組織被系統(tǒng)回收,解決辦法是使用靜態(tài)內(nèi)部類
2.多線程相關(guān)的匿名內(nèi)部類和非靜態(tài)內(nèi)部類
匿名內(nèi)部類同樣會(huì)持有外部類的引用倔叼,如果在線程中執(zhí)行耗時(shí)操作就有可能發(fā)生內(nèi)存泄漏汗唱,導(dǎo)致外部類無法被回收,直到耗時(shí)任務(wù)結(jié)束丈攒,解決辦法是在頁面退出時(shí)結(jié)束線程中的任務(wù)
3.Handler內(nèi)存泄漏
Handler導(dǎo)致的內(nèi)存泄漏也可以被歸納為非靜態(tài)內(nèi)部類導(dǎo)致的哩罪,Handler內(nèi)部message是被存儲(chǔ)在MessageQueue中的,有些message不能馬上被處理巡验,存在的時(shí)間會(huì)很長(zhǎng)际插,導(dǎo)致handler無法被回收,如果handler是非靜態(tài)的显设,就會(huì)導(dǎo)致它的外部類無法被回收框弛,解決辦法是1.使用靜態(tài)handler,外部類引用使用弱引用處理2.在退出頁面時(shí)移除消息隊(duì)列中的消息
4.Context導(dǎo)致內(nèi)存泄漏
根據(jù)場(chǎng)景確定使用Activity的Context還是Application的Context,因?yàn)槎呱芷诓煌段妫瑢?duì)于不必須使用Activity的Context的場(chǎng)景(Dialog),一律采用Application的Context,單例模式是最常見的發(fā)生此泄漏的場(chǎng)景瑟枫,比如傳入一個(gè)Activity的Context被靜態(tài)類引用,導(dǎo)致無法回收
5.靜態(tài)View導(dǎo)致泄漏
使用靜態(tài)View可以避免每次啟動(dòng)Activity都去讀取并渲染View指攒,但是靜態(tài)View會(huì)持有Activity的引用慷妙,導(dǎo)致無法回收,解決辦法是在Activity銷毀的時(shí)候?qū)㈧o態(tài)View設(shè)置為null(View一旦被加載到界面中將會(huì)持有一個(gè)Context對(duì)象的引用允悦,在這個(gè)例子中膝擂,這個(gè)context對(duì)象是我們的Activity,聲明一個(gè)靜態(tài)變量引用這個(gè)View,也就引用了activity)
6.WebView導(dǎo)致的內(nèi)存泄漏
WebView只要使用一次架馋,內(nèi)存就不會(huì)被釋放狞山,所以WebView都存在內(nèi)存泄漏的問題,通常的解決辦法是為WebView單開一個(gè)進(jìn)程叉寂,使用AIDL進(jìn)行通信铣墨,根據(jù)業(yè)務(wù)需求在合適的時(shí)機(jī)釋放掉
7.資源對(duì)象未關(guān)閉導(dǎo)致
如Cursor,F(xiàn)ile办绝,Broadcast等,內(nèi)部往往都使用了緩沖姚淆,會(huì)造成內(nèi)存泄漏孕蝉,一定要確保關(guān)閉它并將引用置為null
8.集合中的對(duì)象未清理
集合用于保存對(duì)象,如果集合越來越大腌逢,不進(jìn)行合理的清理降淮,尤其是入股集合是靜態(tài)的
9.Bitmap導(dǎo)致內(nèi)存泄漏
bitmap是比較占內(nèi)存的,所以一定要在不使用的時(shí)候及時(shí)進(jìn)行清理搏讶,避免靜態(tài)變量持有大的bitmap對(duì)象
10.監(jiān)聽器未關(guān)閉
很多需要register和unregister的系統(tǒng)服務(wù)要在合適的時(shí)候進(jìn)行unregister,手動(dòng)添加的listener也需要及時(shí)移除