通過MAT來進行內存泄露的分析

  可以結合我這篇文章Android中的幾種內存泄露情況總結看。
  運行代碼,然後翻轉下手機,讓Activity多銷燬幾次,打開Android Device Monitor(Android Studio中),找到你的那個應用,Dump HPROF file,然後用SDK platform-tools下的hprof-conv.exe轉化下,轉化的命令行命令爲(注意根據包名做相應變化):

hprof-conv com.whereru.testcode4.hprof com.whereru.testcode4-conv.hprof  

  打開MAT,打開轉化後的文件,打開Dominator Tree,開Dominator Tree上有個可以用正則表達式搜索的框框,我們已經知道MainActivity有內存泄露了,所以直接用MainActivity搜就可以了。當然你也可以通過OQL(Object Query Language)來查詢,命令如下:

select * from instanceof android.app.Activity  

  你會看到好幾個MainActivity,看到網上有人說因爲這很多個MainActivity,所以內存泄露了,這哪跟哪啊,你銷燬了Activity,並不代表馬上會進行GC,所以在沒GC前,這些銷燬的MainActivity在這很正常嘛,內存泄露是指當GC的時候,沒法回收這些已經被銷燬的Activity。
  扯遠了,接着講MAT。然後你選中某個MainActivity,右鍵,選Path To GC Roots,然後你可以exclude掉弱引用,反正它並不會影響GC回收該回收的對象,軟引用也可以exclude掉,內存不夠的時候,它持有的對象也會被回收。然後你便可以看到一層層的引用關係了,也就可以找到誰持有了你想被回收的對象的引用,導致它無法被回收,然後去做相應處理就可以了。
  好吧,我很怕麻煩,所以沒貼任何圖。。。
  對了,其實Android Studio中的那個可以看內存實時變化的有時也挺有用的,可以讓你大體知道做哪些操作的時候會有大的內存消耗,這時候你應該小心處理了。

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