歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 如何用MAT分析Android應用內存洩露

如何用MAT分析Android應用內存洩露

日期:2017/3/1 9:19:34   编辑:Linux編程

使用工具:Android Studio 2.0 Preview, Android Device Monitor, MAT(Memory Analyzer).

點擊Android Studio工具欄上的“Android Device Monitor”,如下圖

打開後選中應用進程,然後點擊“Update heap”,接著反復點擊應用的每個activity,最後“Dump HPROF file”,如下圖1-2-3所示

保存hprof文件。

下面需要對hprof文件進行轉換。

打開CMD終端,進入到\sdk\platform-tools目錄,利用hprof-conv命令轉換hprof文件

hprof-conv F:/a.hprof F:/b.hprof

最終得到b.hprof文件。

到官網:http://www.eclipse.org/mat/downloads.php 下載Memory Analyzer工具。

選擇適合你的版本即可。

打開MemoryAnalyzer.exe,工具欄中選擇“File”->"Open Heap Dump",選擇b.hprof

選中Overview中的Action,點擊“Histogram”

可以搜索工程中的類名,支持部分匹配。我輸入Radar後,匹配出了以下的內容

右鍵其中一個,選擇“Merge Shortest Paths to GC Roots” -> "exclude all phantom/weak/soft etc. references"

還可以利用Overview中的Dominator Tree生成新的列表,再次使用Path to GC Roots -> exclude weak/soft references篩選出跟程序相關的內存洩露的類。給個例子:

由於ToastUtil是一個工具類,方法都是static,且接受Context參數,此時在一個activity中傳入了Activity的context,導致ToastUtil持有了該activity的引用而該activity得不到釋放,內存洩露了。解決辦法:傳一個application context進去,讓此context與ToastUtil具備同樣的生命周期。

此外,Handler使用不當也會出現內存洩露,如在Handler中使用postDelayed。

常用的解決方案有以下:

1、使用靜態內部Handler/Runnable + 弱引用

2、在onDestory的時候,手動清除Message

3、使用Badoo開發的第三方的 WeakHandler

具體請參考這篇文章:使用Android studio分析內存洩露

Copyright © Linux教程網 All Rights Reserved