性能優化工具2——MemoryAnalyzer(MAT)內存泄露的簡單檢測

以下用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章