使用工具: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分析內存洩露