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

金主 · March 08, 2018 · Last by 123 replied at March 08, 2018 · 4840 hits
:文章有说的不对的地方,大家可以帮忙指出!
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 测试基本操作介绍 (一) 中提及了此贴 08 Mar 15:05

顶一下

金主 Monkey 测试日志讲解 (二) 中提及了此贴 08 Mar 15:35

不错

金主 Mac 下如何安装 MySQL 中提及了此贴 09 Mar 12:10
金主 Monkey+battery-historian 电量测试 (五) 中提及了此贴 09 Mar 16:33
simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 13 Dec 14:44
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up