怀疑Activity发生了内存泄漏,怎么定位泄漏的地方?
- 步骤一:验证是否发生了泄漏
使用Android Studio打开Memory profiler【View->Tool Windows】 ,选择自己的进程,选择Memory,操作手机进入要排查的Activity,然后退出Activity,多点击几次GC操作,尽量的让Activity被回收
待上几秒,点击堆栈信息截取按钮
在Android Studio中查看截取的堆栈信息,在筛选框中,输入你的Activity,看列表中是否有你的Activity;如果没有,那么恭喜你,你的Activity没有发生泄漏,放心上线吧!如果有那么恭喜你,你又能学一招了,哈哈
-
步骤二:通过MAT定位内存泄漏的地方
2.1 下载MAT 地址:www.eclipse.org/mat/
2.2 安装MAT 如果你是mac的话,安装后打不开,不要慌,去应用程序,进入到Contents/MacOS/,双击MemoryAnalyzer就OK啦,这时候MAT就会启动起来了,今后想打开依然这样操作
2.3 将刚才在AndroidStudio 中截取的堆栈日志,保存起来
2.4 保存下来的是一个.hprof的文件,这个.hprof是不能被MAT识别的,需要使用Android SDK下的 hprof-conv进行一次转换,这个工具是存放在SDK/platform-tools中的,转换也很方便,直接使用Android中的Terminal命令行,执行
hprof-conv -z 原文件【带路径】 新文件【带路径】
2.5 使用MAT打开你转换后的文件
2.6 打开后页面展示为下面的样式,点击Histogram:
2.7 进入到Histogram的筛选,输入你的Activity名,就会出现内存中你的Activity实例占用情况。Objects列表示内存中这个Activity实例的格式:
3.步骤三:查找Activity内存泄漏的地方:右击你的Activity,选择 Path GC Roots,如图:
ok,内存泄漏的地方已经找到了
这上面介绍的只是涉及步骤,具体工作原理,希望看到的同仁们,自己考究一下,这里就不做详细说明了,关于一些电量、布局优化或排查的也可以联系我,祝工作顺利