博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

Monkey+Logcat+DDMS 内存泄漏分析以及定位 (三)

Posted on 2018-03-20 11:50  二灯大师  阅读(215)  评论(0编辑  收藏  举报

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

  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