内存泄漏--抓取.hprof文件的方法总结

1、AS抓取文件

(1)遇到的问题及解决:

1-1)android studio no debuggable processes

1-2)解决办法

a)Tools->Android->勾选上Enable ADB Integration

b)重新布置app

 

2)下图为用as抓取hprof文件中Monitors-----》Memory中的按钮含义

 

  点击可以开始或者暂停内存检测的按钮。

扫描二维码关注公众号,回复: 3878477 查看本文章

  点击相当于GC操作的按钮,会回收能够回收掉的内存释放空间。

  点击可以直接收集当前检测中hprof文件,生成.hprof结尾文件(点击这个按钮收集之前要先点击GC按钮回收能回收的)。

  点击开始标记某一时间点然后根据自己需求在某一时间点再次点击可以收集到对应检测的时间段内线程中的内存情况,生成.alloc结尾的文件。

3)点击下图图标生成hprof文件

 


(4)查看生成hprof文件目录

点击Studio的最左侧-----Captures

 

双击该文件,在as中显示如图

 

(5)将生成的hprof文件导出

   该文件,右键选择 Export standard .hprof,选择存放目录即可


Ps:

as生成的文件直接可以用MAT打开

 

2、DDMS抓取文件

1)打开DDMS

     通过Android Studio 打开DDMS的步骤如下

 

(2)选中需要查看的程序,并且点击Update Heap图标

 

(3)查看Heap情况

 

但是这仅仅是查看一下Heap的使用情况,那如果发现内存占用或者溢出很严重,动不动就OOM了。通过这个是看不出什么东西的,这个时候就需要把Heap抓出来分析,在UpdateHeap边上还有一个按钮。

(4)生成.hprof文件

 

点一下,会生成一个文件

(刚生成的.hprof文件---以进程名为文件名)

Ps:

   DDMS生成的文件需要转化,才可以用MAT打开

3、adb命令抓取文件

1)命令行提取hprof文件

1-1)2种方式

(a)通过进程名

#adb shell am dumpheap <processname> <FileName><hprof文件的名>

在当前用户下执行命令

b)通过PID

#adb shell am dumpheap <PIDxxx> <FileName><hprof文件的名>

1-2)#adb pull <FileName> <Dir>


Ps:

   DDMS生成的文件需要转化,才可以用MAT打开

4、MAT工具抓取文件

(1)打开工具MAT

(2)选择File------Acquire Heap Dump 如下图

 

(3)在图中看到根据正在运行的进程PID,导出相应的文件

 

文件存放到所选目录,同时MAT可以打开分析

Ps:

MAT抓取的文件直接可以用MAT打开

存在的问题:

1)根据显示的进程PID,通过cmd,执行adb shell ps 查看进程PID没有与之匹配的,就不知道抓取的是哪个应用的泄漏文件;

2)相同的PID内存泄漏文件,使用MAT分析的时候饼状图不一样;


 注解:

 格式转化(可以用MAT打开的)

1)用DDMS生成的.hprof文件需要转换后才可以用MAT打开,转换步骤如下。

1)、把生成的.hprof文件复制到hprof-conv所在目录(在SDK安装目录下的platform-tools文件夹下)。

2)、打开CMD命令行,输入hprof-conv xxxxx.hprof yyyyy.hprof(其中xxxxx.hprof为原先生成的hprof文件,yyyyy.hprof为转换之后hprof)。

2)具体例子:

#/android-sdk/platform-tools/hprof-conv <FileName> <newFileName>.hprof

 

adb命令未实现的:

1) 命令行方式抓取,方法如下:
a) 通过输入adb命令的方式抓取,PIDXXX为对应进程的PID
   adb remount
   adb shell chmod 0777 /data/misc
   adb shell kill -10 PIDXXX
b) 会在/data/misc目录下生成一个以pidXXX.hprof结尾的hprof文件。
c) 然后通过adb pull或其他方式将这个文件导出来即可。

2)问题:

可以导出内容,但是么有.hprof文件呢???

注解:

777=4+2+1    4+2+1   4+2+1   
         用户          其他

    chmod 777 file 给一个文件改权限

总结:

(1)暂时总结了4种抓取文件的方法,1和4是不需要转化的,2和3需要转化才可以员工MAT打开;

(2)没有问题的可以实施的是方法1、2和3;

(3)方法4 :问题不知道那个进程;

(4)命令还可以抓取但是未实现,不知道问啥?


猜你喜欢

转载自blog.csdn.net/Happy_Develop_/article/details/79099227