以下用MemoryAnalyzer對內存泄漏的檢測作簡單介紹:
首先androidStudio自帶Memory Monitor可以分析內存泄漏問題,方法如下,當我們執行了一系列操作後點擊垃圾回收(需要先進行垃圾回收,這樣才能發現那些該回收的類沒有被回收掉)然後就可以點擊 dump java heap 進行分析了:
點開後如圖2:
如上class name下,我們可以簡單的查看自己的類的一些,比如你輸入“mainactivity”發現它的heap count有2個,這一般來講就不正常了。
analyzer tasks 可以自動幫你分析那些地方可能泄露
下面的tree 可以查看一些引用關係。
關於jump java heap 不多說,自己查資料看,我是覺得analyzer tasks達不到我的要求。接下來講講怎麼簡單使用MAT
第一步:導出MemoryAnalyzer可以查看的文件
打開MemoryAnalyzer導入文件:
這裏我們可以先點擊一下leak suspects,這是系統分析出來可能存在泄漏的地方,一般我們的一些activity被持有什麼的都可以從這裏直接看到。
第二步:分析泄漏
在這之前首先要注意一點,我們這個文件是要在點擊垃圾回收後生成的。簡單的說比如:我們依次打開了A-B-C三個activity,隨後關閉了B和C,垃圾回收後發現已經不再使用的B和C還存在,這就說明可能發生了泄漏。(假如先調用垃圾回收的話,B和C的存在就不能說明發生了泄漏)
該關閉的沒關閉,這時候就要看看是哪些地方引用了它們(這裏我們排除可以被回收的弱引用和軟引用,只查看強引用)
打開結果如圖:
這下找到了原因了,解釋一下:由於findit這個對象下的接口mainEventListen持有GameTypeTwo這個對象,所以GameTypeTwo無法釋放。而GameTypeTwo又引用了QuestionLook的實例questionBeans(請忽略這裏的命名不規範問題),所以導致了最後這幾個類都無法釋放。so easy!
再去查看類GameTypeTwo的引用:
可以發現確實是接口持有對象沒釋放,和上面的結果一致!
擴展:
內存泄露簡單分析到上面就結束了,有時候一個文件也許不能分析出問題,我們可能需要對比分析,怎麼做?如下:
將所有需要對比的文件進行上面操作後,點擊紅色感嘆號就可以觀察差別了:
對比如下:
!
好了,以上就是這次介紹的東西了。有什麼不對的歡迎指正
————————————————
版權聲明:本文爲CSDN博主「Else_Q」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qiaoyl113/article/details/78835641