什么是MAT
全名是 Memory Analyzer是一个快速且功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。官网地址
下载地址
MemoryAnalyzer-1.9.0.20190605-win32.win32.x86_64密码:scih
MemoryAnalyzer-1.9.0.20190605-win32.win32.x86密码:d7u9
MemoryAnalyzer-1.9.0.20190605-macosx.cocoa.x86_64密码:rhk9
安装
mac环境上安装如果报错提示 在/.eclipse/1528649425_macosx_cocoa_x86_64/configuration/1539332382530.log路径下查看错误日志
参考Mac安装MAT报错解决方法
Android studio导出hprof
这里以Android Studio 3.2说明,运行程序之后会出现下面的profiler
按钮
点击profiler
按钮会出现以下页面,我们只需要关注 MEMORY
然后点击红色区域的 MEMORY
,进入详情页面
运行项目之后在可能出现泄漏的页面在手机上来回进入退出几次
然后点击上图中红色区域的按钮,左侧就会出现 Heap Dump
再点击箭头指向的按钮,就可以生成一个hprof的本地文件了。但是此时直接导入MAT工具会报错,所以需要用到Android sdk下platform-tools
目录中的hprof-conv
工具转化。
格式:hprof-conv 源文件 目标文件
hprof-conv /Users/xxx/a.hprof /Users/xxx/b.hprof
MAT使用
工具栏中选择“File”->“Open Heap Dump”,选择b.hprof
点击 Acticons
下 Histogram
可以搜索项目中的类名,支持模糊搜索。输入 Activity
后,匹配出了以下的内容
找到自己项目中的 Activity
,就是就是上图中的 FirstActivity
,然后右键,选择 “Merge Shortest Paths to GC Roots” -> "exclude all phantom/weak/soft etc. references"
上图中的结果就是一个 Handle
延迟导致的泄漏分析结果
上图就是一个 Handler
泄漏的写法,常用的解决方案有以下:
1、使用静态内部Handler/Runnable + 弱引用
2、在onDestory的时候,手动清除Message