内存泄漏检测分析工具

来源:互联网 发布:c 高斯算法 编辑:程序博客网 时间:2024/04/29 02:09

monkey 工具测试应用

可以使用monkey自动化测试工具快速不断的操作应用。终端指令:

// 300 毫秒一个事件,2000个事件,跑10分钟adb shell monkey -p com.android.deskclock -v --throttle 300 --ignore-crashes --ignore-security-exceptions --ignore-timeouts 2000

参数说明:

adb shell monkey 2000           // 2000个随机事件-p                              // 指定包名-v                              // 日志级别 -v/-v -v/-v -v -v--throttle 300                  // 事件间隔时间--ignore-crashes                // 忽略应用crash信息,继续执行--ignore-security-exceptions    // 忽略安全异常--ignore-timeouts               // 

Android divece monitor 获取hprof文件

使用Android studio的divece monitor工具,或者 DDMS 工具可以获得hprof文件。
hprof文件是虚拟机的内存快照,包含某一时刻虚拟机内存占用情况信息。

Markdown
1. 使用eng版本(root后的)手机连接电脑,打开 ddms 工具,在左侧选中自己应用的进程。
2. 在右侧界面多个tab页中选中 heap tab 页。
3. 点击选择 update heap 按钮,之后 heap 数据会自动更新。按钮在左上方。
4. 点击cause GC 按钮执行一次 GC , 界面上数据会显示出来。
5. 跑了一段时间 monkey 后,就可以dump hprof 文件了。点击左上角按钮5 dump hprof file ,一个短暂的延迟后,会弹出选择保存文件位置的弹框。

保存下来的hprof文件无法直接用 MAT 打开,需要使用 Android hprof-conv 工具转换为标准的 hprof 格式文件。这个工具在Android/Sdk/platform-tools目录下,使用方法:

$ ./hprof-conv ~/path/before.hprof ~/path/after.hprof

使用 MAT(Memory analysis tool)分析 hprof文件

工具下载地址:http://www.eclipse.org/mat/downloads.php

MAT 是一个内存分析工具,它不会为你指出具体哪一块代码导致了内存泄露,需要我们自己根据内存信息分析出问题点。

Markdown

使用 MAT 打开 hprof 文件,主界面是一个展示内存占用比例的饼图,我们主要使用左下两个圈红的功能进行内存分析。

  • Histogram : 该操作可以列出 heap 中每个类的实例个数。
  • Dominator Tree : 该操作可以列出占用内存最大的对象,以及该对象被谁所引用导致不能释放。

jvm 判断对象是否存活采用的是可达性分析算法,算法的基本思路就是通过一系列称为 “GC roots” 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

所以我们分析的目标就是找出那些不应该存在的对象实例,以及是什么引用了它们导致不能释放。

Markdown

打开 Histogram 视图,并在正则表达式栏中输入本项目相关的匹配信息,查看类实例的数量。从图中可以看出,一个首页Activity居然同时有9个实例,这明显是不正常的,说明有什么导致了Activity的实例没有被回收。

Dominator Tree View :

Markdown

Dominator Tree 有两列展示 heap 大小:
- shallow heap : 对象真实占用的内存大小
- retained heap : 该对象被回收,可能所能释放的最大内存大小

如图,选中一 retained heap 远大于 自身 shallow heap 的对象,查看对象到GC Roots的引用路径。(将软引用,弱引用等忽略,因为只有强引用会导致对象无法回收)
Markdown

可以明确看出对象的引用路径,我们需要根据对象引用信息,去代码中找到具体的使用不当的地方,然后修复。比如这个例子是因为 EventBus 持有了 Activity 的实例没有释放,导致Activity的资源都无法释放。

阅读全文
1 0
原创粉丝点击