Android ——MAT内存泄漏排查

1,053 阅读2分钟

怀疑Activity发生了内存泄漏,怎么定位泄漏的地方?

  1. 步骤一:验证是否发生了泄漏

使用Android Studio打开Memory profiler【View->Tool Windows】 ,选择自己的进程,选择Memory,操作手机进入要排查的Activity,然后退出Activity,多点击几次GC操作,尽量的让Activity被回收

截屏2021-06-22 下午8.44.41.png

待上几秒,点击堆栈信息截取按钮

截屏2021-06-22 下午8.48.18.png

在Android Studio中查看截取的堆栈信息,在筛选框中,输入你的Activity,看列表中是否有你的Activity;如果没有,那么恭喜你,你的Activity没有发生泄漏,放心上线吧!如果有那么恭喜你,你又能学一招了,哈哈

截屏2021-06-22 下午8.51.57.png

  1. 步骤二:通过MAT定位内存泄漏的地方

    2.1 下载MAT 地址:www.eclipse.org/mat/

截屏2021-06-22 下午9.03.21.png

截屏2021-06-22 下午9.03.49.png

2.2 安装MAT 如果你是mac的话,安装后打不开,不要慌,去应用程序,进入到Contents/MacOS/,双击MemoryAnalyzer就OK啦,这时候MAT就会启动起来了,今后想打开依然这样操作

截屏2021-06-22 下午9.05.39.png

2.3 将刚才在AndroidStudio 中截取的堆栈日志,保存起来

截屏2021-06-22 下午9.08.51.png

2.4 保存下来的是一个.hprof的文件,这个.hprof是不能被MAT识别的,需要使用Android SDK下的 hprof-conv进行一次转换,这个工具是存放在SDK/platform-tools中的,转换也很方便,直接使用Android中的Terminal命令行,执行

hprof-conv -z  原文件【带路径】 新文件【带路径】

截屏2021-06-23 上午8.38.36.png

2.5 使用MAT打开你转换后的文件

截屏2021-06-23 上午8.42.19.png

2.6 打开后页面展示为下面的样式,点击Histogram:

截屏2021-06-23 上午8.44.30.png

2.7 进入到Histogram的筛选,输入你的Activity名,就会出现内存中你的Activity实例占用情况。Objects列表示内存中这个Activity实例的格式:

截屏2021-06-23 上午8.47.15.png

3.步骤三:查找Activity内存泄漏的地方:右击你的Activity,选择 Path GC Roots,如图:

截屏2021-06-23 上午8.50.29.png

ok,内存泄漏的地方已经找到了

截屏2021-06-23 上午8.52.31.png

这上面介绍的只是涉及步骤,具体工作原理,希望看到的同仁们,自己考究一下,这里就不做详细说明了,关于一些电量、布局优化或排查的也可以联系我,祝工作顺利