前言
MAT是闻名海内外的内存泄漏检测工具,虽然不能指望MAT告诉我们哪里泄漏了,但是,借用这个工具,可以分析、定位出很多内存占用和泄漏的问题。最近做了公司内某款应用内存占用和内漏问题的测试。偷得半日闲,总结下经验教训。因开发仍在优化问题解决中,暂时总结问题检测方法。
特别鸣谢:明哥、田姐姐,良师益友的存在,一直是我前进道路上的灯塔。
- 直接下载独立版:http://www.eclipse.org/mat/downloads.php
- 下载eclipseIDE插件:打开Eclipse - >help - > Install New Software,在work with输入:http://download.eclipse.org/mat/1.6/update-site/
- 为防止内存镜像过大,造成堆溢出,设置 …\IDE\eclipse\eclipse.ini,修改-Xmx为:-Xmx2048m
2.ImageMagick(支持MAC、Linux、Windows):用于转化字节数组为图片
下载地址:http://www.imagemagick.org/script/download.php
3.MPA助手(公司自己开发的用于监控性能数据及内存分析工具),用于监控性能数据:
4.dump内存镜像和镜像转化脚本:https://github.com/stayhungryYu/memory
*另外附带用于某场景验证的脚本,Android内存dump文件到PC并转化
理论基础
内存:
进程总内存占用: 220.59M
1)JavaHeap: 90.08M
2)NativeHeap:native层的 so 中调用malloc或new创建的内存 —— 28.44M
3)Graphics:OpenGL和SurfaceFlinger相关内存 ——28.15M
4)Stack:线程栈——1.81M
5)Code:dex+so相关代码占用内存——64.16M
6)Other:7.96M
上述6中内存占用除了两种不需要考虑,其他5中通通需要优化。不需要考虑的是:
Other:暂时无从分析
Graphics:若应用没有直接调用OpenGL,则可以确定这部分内存是由Android Framework操控的,可以忽略。(当然对于游戏类应用,这里肯定是优化重点。)
测试前的小插曲
- MAT(或者说整个DDMS)检测并显示进程,需要APP打开debugable开关:AndroidManifest.xml文件里配置,android:debuggable=“true”
- 测试场景、用例可以详细,但无需过度详细,主要关注:
- 应用内页面之间的跳转切换、视图窗口的开与关——看是否及时释放(有些应用为了快速恢复现场,选择不释放,视项目而定)及是否有泄漏泄漏
- 应用之间的切换(跳转),应用前后台切换——看是否及时释放(有些应用为了快速恢复现场,选择不释放,视项目而定)及是否有泄漏泄漏
- 前后、后台台静置——看是否有持续内存增加,
(如果支持)设备横竖屏转屏——看是否有内存泄漏,主要是重复创建问题
MAT问题排查套路(其实并没有套路,只有经验)
网上几个不错的帖子:
- Android 内存泄露实践分析 https://testerhome.com/topics/5822
- Android 性能优化之使用MAT分析内存泄露问题 https://blog.csdn.net/xiaanming/article/details/42396507
- 使用MAT (Memory Analyzer Tool)分析Andriod项目内存泄漏 https://www.jianshu.com/p/41e3aaf915e5
- Android 应用内存泄露分析、改善经验总结 https://tester