主目錄見:Android高級進(jìn)階知識(這是總目錄索引)
[written by 無心追求]
寶貝中心頭像切換
- com.xtc.watch.view.widget.fancycover.FancyCoverFlowItemWrapper存在內(nèi)存泄漏
- Objects:
[圖片上傳失敗...(image-2d2801-1511154103918)] - path to gc roots:
[圖片上傳失敗...(image-289e28-1511154103918)]
從上面的gc roots來看,F(xiàn)actCoverFlowItemWrapper是被多個(gè)對象所持有的,無論怎樣都是不能被釋放的,在代碼中創(chuàng)建FactCoverFlowItemWrapper的部分:
[圖片上傳失敗...(image-c1ef40-1511154103918)]
只要FactCoverFlowItemWrapper創(chuàng)建出來之后就無法被釋放了,這個(gè)確實(shí)有點(diǎn)坑,在界面中
[圖片上傳失敗...(image-b4f87e-1511154103918)]
正常的話應(yīng)該是有4個(gè)FactCoverFlowItemWrapper對象的,這里多出了3個(gè),還會存在一個(gè)風(fēng)險(xiǎn),如果手表解綁,那么應(yīng)該溢出掉對應(yīng)的FactCoverFlowItemWrapper對象,但是從gc roots來看,F(xiàn)actCoverFlowItemWrapper會一直被引用的,所以有可能解綁手表后對應(yīng)的FactCoverFlowItemWrapper即使移除了也無法被及時(shí)回收。
微聊模塊
- ChatActivity
[圖片上傳失敗...(image-4585c7-1511154103918)]
創(chuàng)建了5個(gè)activity對象導(dǎo)致ChatActivity里面的一些對象引用都沒有被釋放
[圖片上傳失敗...(image-cc304b-1511154103918)]
Gc roots:
[圖片上傳失敗...(image-54a49f-1511154103918)]
預(yù)測是activity退出了,但是AudioManager還在執(zhí)行 - VoiceMsg
[圖片上傳失敗...(image-a62e9c-1511154103918)]
代碼中根本沒有18條語音
Gc roots:
[圖片上傳失敗...(image-abb86c-1511154103918)]
這個(gè)原因應(yīng)該是ChatActivity泄漏導(dǎo)致的,如果ChatActivity正常釋放應(yīng)該就正常了 - ViewHolder
[圖片上傳失敗...(image-96bb5a-1511154103918)]
Gc roots:
[圖片上傳失敗...(image-95de11-1511154103918)]
定位模塊
- com.xtc.watch.view.location.activity.LocationMainActivity
gc roots:
[圖片上傳失敗...(image-82eaff-1511154103918)]
這里倒是不會造成內(nèi)存泄漏,只是在activity界面退出的時(shí)候沒有及時(shí)取消ArcImageButton的動畫,所以導(dǎo)致Activity無法立刻被回收,如果短時(shí)間內(nèi)反復(fù)的進(jìn)入退出定位界面,那么將會創(chuàng)建多個(gè)activity對象,然后等動畫執(zhí)行完了之后,這些activity才能在被gc的時(shí)候回收掉
修改建議:把ArcImageButton動畫在onDestroy方法里面取消掉
登錄模塊
[圖片上傳失敗...(image-366f08-1511154103918)]
由于MainActivity沒有釋放,所以導(dǎo)致里Bitmap占用的內(nèi)存也沒有被釋放
[圖片上傳失敗...(image-d641ce-1511154103918)]
MainActivity泄漏導(dǎo)致里面的Bitmap無法被回收,導(dǎo)致7.9MB的內(nèi)存可能出現(xiàn)問題
[圖片上傳失敗...(image-2f509-1511154103918)]
Gc roots:
[圖片上傳失敗...(image-ec3fc4-1511154103918)]
可能存在的問題代碼MainActivity類:
[圖片上傳失敗...(image-3423c3-1511154103918)]
進(jìn)入主界面后MainActivity沒有finish掉
修改建議:在啟動HomePageActivity之后把MainActivity finish掉
通訊錄模塊
[圖片上傳失敗...(image-816fc5-1511154103918)]
Gc roots:
[圖片上傳失敗...(image-8fa492-1511154103918)]
[圖片上傳失敗...(image-881494-1511154103918)]
[圖片上傳失敗...(image-451bc-1511154103918)]
[圖片上傳失敗...(image-13ee75-1511154103918)]
代碼問題:
[圖片上傳失敗...(image-a9b8bf-1511154103919)]
umengSocialUtil在創(chuàng)建的時(shí)候直接使用當(dāng)前activity對象作為參數(shù),但是這個(gè)參數(shù)必須傳activity對象,所以修改建議是:對UmengSocialUtil做修改,因?yàn)檫@個(gè)activity對象會保存到友盟分享sdk的一些類里面,當(dāng)activity退出的時(shí)候把UmengSocialUtil里面的相關(guān)對象釋放掉
修改設(shè)置類開關(guān)
com.xtc.watch.view.message.helper.MessageControl存在內(nèi)存泄漏:
[圖片上傳失敗...(image-bedec6-1511154103919)]
我反復(fù)gc,過了很久之后再次gc,上述對象依然沒有被回收
Gc roots:
[圖片上傳失敗...(image-c6742a-1511154103919)]
問題代碼:
[圖片上傳失敗...(image-815fb1-1511154103919)]
線程中執(zhí)行的是數(shù)據(jù)庫操作實(shí)現(xiàn)異步,但是我并不明白在子線程中加Looper.prepare()和Looper.loop()干嘛?又沒有彈Toast?loop()方法是一個(gè)死循環(huán),導(dǎo)致這個(gè)線程一直無法結(jié)束所以一直存在,因此線程中的對象無法被釋放,同時(shí)這個(gè)線程也占用了內(nèi)存資源
APP設(shè)置模塊
- XtcDescBookActivity
[圖片上傳失敗...(image-9dd6b6-1511154103919)]
Gc roots:
[圖片上傳失敗...(image-f1078c-1511154103919)]
上面可以看到是由于webkit在activity退出的時(shí)候沒有destroy導(dǎo)致CleanupReferrece里面一直持有Context造成的泄漏
修改建議:
把webview首先從父控件中remove掉,然后再調(diào)用destroy方法 - AboutActivity
[圖片上傳失敗...(image-2a62b7-1511154103919)]
Gc roots:
[圖片上傳失敗...(image-d29c8e-1511154103919)]
仍然是由于友盟分享工具類造成的activity引用被持有了
修改建議:根據(jù)泄漏原因把友盟分享工具改改,在activity退出的時(shí)候顯示的把引用設(shè)置為null
主界面
[圖片上傳失敗...(image-7505f0-1511154103919)]
丫的我都已經(jīng)退出登錄了,正常的話主界面應(yīng)該已經(jīng)被回收了,所以不會再有HomePageActivity的對象存在了
Gc roots:
[圖片上傳失敗...(image-520167-1511154103919)]
話不多,有幾個(gè)地方同時(shí)持有了HomePageActivity的引用
修改建議:傳參數(shù)Context的時(shí)候如果不是必須用Activity就盡量用全局的ApplicationContext,或者在Activity的onDestroy把一些引用手動設(shè)置為null,但是這個(gè)好像沒用,搜索了網(wǎng)上的解決方案發(fā)現(xiàn)展示webview界面可以單獨(dú)開啟一個(gè)進(jìn)程,退出后再殺死這個(gè)進(jìn)程,這樣就不會造成webview的內(nèi)存泄漏了,個(gè)人覺得這個(gè)靠譜,可以嘗試
單例內(nèi)存問題
發(fā)現(xiàn)一個(gè)問題,當(dāng)app使用了很多模塊之后,有很多單例實(shí)現(xiàn)的ServiceImpl類其實(shí)在退出后可能并不會頻繁的調(diào)用到,但是單例對象還是占用這內(nèi)存的,雖然占用的內(nèi)存非常小,有幾十B,也有兩三百B,優(yōu)化建議:可以采用弱引用來持有單例