加快使程序暴漏内存泄漏的方法
- 旋转activity
- 在不同的activity或应用间切换,切到home,再切回到你的应用。
使用monkey的--pct-rotation参数(翻译屏幕旋转,横屏竖屏事件)暴露出内存泄漏
adb shell monkey -s 1 -p 包名 --throttle 100 --pct-rotation 30 -v -v -v 1000
怎么确定内存泄漏?
- 通过logcat确定内存泄漏,请查看文章 Monkey+Logcat 查找 ANR 问题(四)
-
使用DDMS 监控内存值,如果出现过大等递增异常就可能存在内存泄漏。
- 打开窗口,执行
ddms
- 手机打开要测试的应用程序,注意,该应用程序必须为debug模式,否则无法查看设备进程。已经为debug模式了的,直接看d
-
如何更改应用程序为debug模式,请查看文章,里面有详细讲解:
-
操作步骤看图
1. 选中要查看的进程,点击1
2. 启动对我们需要测试的进程的检测程序,点击2
3. 查看VM Heap,点击3
4. 向虚拟机请求一次GC操作,点击4,请求一次之后就不用再次点击该按钮了,因为Heap会刷新页面,来显示当前的内存的变化。
5. 点击5(可不点),点了能查看allocation count per size数据的起伏变化
6. 观察6,data object的Total Size值
-
分析data object的Total Size数据
1. 不断在手机上操作一个功能,如果该数据在不断地增加,每次GC后没有明显的回落,则判定该功能模块存在内存泄露问题。2. 如果反复操作该功能之后,有一定范围的起伏,但是又被稳定在某一个有限的范围内,则说明代码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对象,而在虚拟机不断的进行GC的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;
3. 如果有效内存,手机可能会出现程序被kill,但是程序被kill并不能代表程序一定有内存泄露。
- 打开窗口,执行
3. 发现内存泄漏,则保存该应用的堆信息输出到HPROF文件中 :
adb shell am dumpheap 包名 data/local/tmp/hprof.hprof
4. 将保存好的.hprof文件pull到本地上
adb pull /data/local/tmp/hprof.hprof /Users/weixiangyang/Desktop/
5. 安装Memory Analyzer tool(MAT)查看hprof1.hprof文件
- 打开eclipse,点击 Install New Software
- 在弹出的install页面中勾选Memory Analyzer for Eclipse IDE选项。 若没有勾选Memory Analyzer for Eclipse IDE选项,点击地址栏旁边的Add,在location里输入:http://download.eclipse.org/mat/1.2/update-site/OK即可。,点击
- 确定了之后,出现了选择安装的界面。选择全部即可。进行下一步一路next下去即可。
- 安装完成后提示重启Eclipse,重启后打开window - > open perspective,看到Memory Analysis证明安装成功。
6. 使用eclipse的Memory Analyzer tool(MAT)查看转化后的hprof1.hprof文件
-
导入hprof1.hprof文件
- 在MAT中点击 File->Open File
- 提示报错
- 使用hprof-conv命令转换为MAT可读文件 格式:
hprof-conv <原HPROF文件路径> <转换后的HPROF文件路径>
执行:hprof-conv /Users/weixiangyang/Desktop/hprof.hprof /Users/weixiangyang/Desktop/hprof1.hprof
-
打开hprof1.hprof文件,选择Leak Suspects Report,然后finish
-
hprof1.hprof文件打开,生成一个Overview视图,这个图是一个概要图,显示了一些统计信息,包括整个size大小,class数量,以及对象 的数量,同时还将生成一个大对象的top图,并线显示大对象占用内存的百分比。
- 在MAT中点击 File->Open File
7. 找出溢出源
点击我图上框的按钮,列出每個class产生了多少個实例,以及占有多大内存,所占百分比
8. 定位溢出的原因
过滤掉虚引用、弱引用、以及软引用,留下强引用,并显示GC跟路径:点击Path to GC Roots
或者Merge Shortest Paths to GC Roots
9. 分析完后提交报告给开发
在成功导入hprof1.hprof文件后,会发现桌面生成了一大堆文件,找到.zip文件,解压,提取出index.html文件给开发就行了。