移动性能测试 Monkey+Logcat+DDMS 内存泄漏分析以及定位 (三)

金主 · 2018年03月08日 · 最后由 随风飘摇 回复于 2018年03月08日 · 4675 次阅读
:文章有说的不对的地方,大家可以帮忙指出!
Monkey 测试基本操作介绍(一)
Monkey 测试日志讲解(二)
Monkey+Logcat+DDMS 内存泄漏分析以及定位(三)
Monkey+Logcat+traces 查找以及分析定位 ANR 问题(四)
Monkey+battery-historian 电量测试(五)

加快使程序暴漏内存泄漏的方法

  1. 旋转 activity
  2. 在不同的 activity 或应用间切换,切到 home,再切回到你的应用。

使用 monkey 的--pct-rotation 参数(翻译屏幕旋转,横屏竖屏事件)暴露出内存泄漏

adb shell monkey -s 1 -p 包名 --throttle 100 --pct-rotation 30 -v -v -v 1000

怎么确定内存泄漏?

  1. 通过logcat确定内存泄漏,请查看文章 Monkey+Logcat 查找 ANR 问题(四)
  2. 使用DDMS 监控内存值,如果出现过大等递增异常就可能存在内存泄漏。

    1. 打开窗口,执行ddms
    2. 手机打开要测试的应用程序,注意,该应用程序必须为 debug 模式,否则无法查看设备进程。已经为 debug 模式了的,直接看 d
    3. 如何更改应用程序为 debug 模式,请查看文章,里面有详细讲解:

      安卓未 root 查看 data 目录文件

      使用 apktool 工具对 Android APK 进行反编译与回编译

    4. 操作步骤看图

      1. 选中要查看的进程,点击 1

      2. 启动对我们需要测试的进程的检测程序,点击 2

      3. 查看 VM Heap,点击 3

      4. 向虚拟机请求一次 GC 操作,点击 4,请求一次之后就不用再次点击该按钮了,因为 Heap 会刷新页面,来显示当前的内存的变化。

      5. 点击 5(可不点),点了能查看 allocation count per size 数据的起伏变化

      6. 观察 6,data object 的 Total Size 值

    5. 分析 data object 的 Total Size 数据
      1. 不断在手机上操作一个功能,如果该数据在不断地增加,每次 GC 后没有明显的回落,则判定该功能模块存在内存泄露问题。

      2. 如果反复操作该功能之后,有一定范围的起伏,但是又被稳定在某一个有限的范围内,则说明代码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对象,而在虚拟机不断的进行 GC 的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;

      3. 如果有效内存,手机可能会出现程序被 kill,但是程序被 kill 并不能代表程序一定有内存泄露。

    6. 实战操作请参考:https://www.cnblogs.com/kevinqinan/p/3755328.html

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 文件

  1. 打开 eclipse,点击 Install New Software
  2. 在弹出的 install 页面中勾选 Memory Analyzer for Eclipse IDE 选项。 若没有勾选 Memory Analyzer for Eclipse IDE 选项,点击地址栏旁边的 Add,在 location 里输入:http://download.eclipse.org/mat/1.2/update-site/OK 即可。,点击
  3. 确定了之后,出现了选择安装的界面。选择全部即可。进行下一步一路 next 下去即可。
  4. 安装完成后提示重启 Eclipse,重启后打开 window - > open perspective,看到 Memory Analysis 证明安装成功。

6. 使用 eclipse 的 Memory Analyzer tool(MAT) 查看转化后的 hprof1.hprof 文件

  1. 导入 hprof1.hprof 文件

    1. 在 MAT 中点击 File->Open File
    2. 提示报错
    3. 使用 hprof-conv 命令转换为 MAT 可读文件 格式:hprof-conv <原HPROF文件路径> <转换后的HPROF文件路径> 执行:hprof-conv /Users/weixiangyang/Desktop/hprof.hprof /Users/weixiangyang/Desktop/hprof1.hprof
    4. 打开 hprof1.hprof 文件,选择 Leak Suspects Report,然后 finish

    5. hprof1.hprof 文件打开,生成一个 Overview 视图,这个图是一个概要图,显示了一些统计信息,包括整个 size 大小,class 数量,以及对象 的数量,同时还将生成一个大对象的 top 图,并线显示大对象占用内存的百分比。

7. 找出溢出源

点击我图上框的按钮,列出每個 class 产生了多少個实例,以及占有多大内存,所占百分比

8. 定位溢出的原因

过滤掉虚引用、弱引用、以及软引用,留下强引用,并显示 GC 跟路径:点击Path to GC Roots或者Merge Shortest Paths to GC Roots

9. 分析完后提交报告给开发😁

在成功导入 hprof1.hprof 文件后,会发现桌面生成了一大堆文件,找到.zip 文件,解压,提取出 index.html 文件给开发就行了。

MAT 参考链接:https://www.cnblogs.com/nsw2018/p/6361666.html

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 2 条回复 时间 点赞
金主 Monkey 测试基本操作介绍 (一) 中提及了此贴 03月08日 15:05
金主 Monkey 测试日志讲解 (二) 中提及了此贴 03月08日 15:35
金主 Mac 下如何安装 MySQL 中提及了此贴 03月09日 12:10
金主 Monkey+battery-historian 电量测试 (五) 中提及了此贴 03月09日 16:33
simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44
simple [精彩盘点] TesterHome 社区 2018 年 度精华帖 中提及了此贴 01月07日 12:08
金主 Monkey+Logcat+DDMS 内存泄漏分析以及定位 (三) 中提及了此贴 01月21日 01:17
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册