android手机测试中如何查看内存泄露
(一) 生成.hprof文件
生成.hprof 文件的方法有很多,而且Android 的不同版本中生成.hprof 的方式也稍有差别,我使用的版本的是2.1,各个版本中生成.prof 文件的方法请参考: http://android.git.kernel.org/?p=platform/dalvik.git;a=blob_plain;f=docs/heapprofiling.html;hb=HEAD。
1. 打开eclipse 并切换到DDMS 透视图,同时确认Devices、Heap 和logcat 视图已经打开了;
2. 将手机设备链接到电脑,并确保使用“USB 调试”模式链接,而不是“Mass Storage“模式;
3. 链接成功后在Devices 视图中就会看到设备的序列号,和设备中正在运行的部分进程;
4. 点击选中想要分析的应用的进程,在Devices 视图上方的一行图标按钮中,同时选中“Update Heap”和“Dump HPROF file”两个按钮;
5. 这是DDMS 工具将会自动生成当前选中进程的.hprof 文件,并将其进行转换后存放在sdcard 当中,如果你已经安装了MAT 插件,那么此时MAT 将会自动被启用,并开始对.hprof 文件进行分析;
注意:第4 步和第5 步能够正常使用前提是我们需要有sdcard,并且当前进程有向sdcard中写入的权限(WRITE_EXTERNAL_STORAGE),否则.hprof 文件不会被生成,
在logcat 中会显示诸如 ERROR/dalvikvm(8574): hprof: can't open /sdcard/com.xxx.hprof-hptemp: Permission denied.的信息。
如果我们没有sdcard,或者当前进程没有向sdcard 写入的权限(如system_process), 那我们可以这样做:
6. 在当前程序中,例如framework 中某些代码中,可以使用android.os.Debug 中的: public static void dumpHprofData(String fileName) throws IOException 方法,手动的指定.hprof 文件的生成位置。
例如: xxxButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { android.os.Debug.dumpHprofData("/data/temp/myapp.hprof"); ... ... } }
上述代码意图是希望在xxxButton 被点击的时候开始抓取内存使用信息,并保存在我们指定的位置:/data/temp/myapp.hprof,这样就没有权限的限制了,而且也无须用sdcard。
但要保证/data/temp 目录是存在的。这个路径可以自己定义,当然也可以写成sdcard 当中的某个路径。
(二) 使用MAT导入.hprof文件
1. 如果是eclipse 自动生成的.hprof 文件,可以使用MAT 插件直接打开(可能是比较新的ADT才支持);
2. 如果eclipse 自动生成的.hprof 文件不能被MAT 直接打开, 或者是使用android.os.Debug.dumpHprofData()方法手动生成的.hprof 文件,则需要将.hprof 文件进行转换,转换的方法: 例如我将.hprof 文件拷贝到PC 上的/ANDROID_SDK/tools 目录下,并输入命令hprofconv xxx.hprof yyy.hprof,其中xxx.hprof 为原始文件,yyy.hprof 为转换过后的文件。转换过后的文件自动放在/ANDROID_SDK/tools 目录下。OK,到此为止,.hprof 文件处理完毕,可以用来分析内存泄露情况了。
3. 在Eclipse 中点击Windows->Open Perspective->Other->Memory Analyzer,或者打Memory Analyzer Tool 的RCP。在MAT 中点击File->Open File,浏览并导入刚刚转换而得到的.hprof文件。
(三) 使用MAT的视图工具分析内存
导入.hprof 文件以后,MAT 会自动解析并生成报告,点击Dominator Tree,并按Package分组,选择自己所定义的Package 类点右键,在弹出菜单中选择List objects->With incoming references。这时会列出所有可疑类,右键点击某一项,并选择Path to GC Roots -> exclude weak/soft references,会进一步筛选出跟程序相关的所有有内存泄露的类。据此,可以追踪到代码中的某一个产生泄露的类。
MAT 的界面如下图所示。
具体的分析方法在此不做说明了,因为在MAT 的官方网站和客户端的帮助文档中有十分详尽的介绍。 了解MAT 中各个视图的作用很重要,例如www.eclipse.org/mat/about/screenshots.php 中介绍的。
总之使用MAT 分析内存查找内存泄漏的根本思路,就是找到哪个类的对象的引用没有被释放,找到没有被释放的原因,也就可以很容易定位代码中的哪些片段的逻辑有问题了。
另外在测试过程首先需要分析怎么样操作一个应用会产生内存泄露然后在不断的操作中抓取该进程产生的hhprof文件使用MAT工具分析。目前自己的了解查看内存分析内存泄露还有以下几种方法:
1.使用top命令查看某个进程的内存。例如创建一个脚本文件music.sh 该文件内容为指定程序每隔一秒钟输出某个进程的内存使用情况,在此具体实现如下 :
#!/bin/bash
while true; do
adb shell procrank | grep "com.android.music"
sleep 1
done
并且配合使用procank工具可以查看music进程每一秒钟内存使用情况。
2.另外使用top命令也可是查看内存具体为:
adb shell top -m 10.(查看使用资源最多的10个进程)
adb shell top|grep com.android.music(查看music进程的内存)
3.free命令
free
1.作用free命令用来显示内存的使用情况,使用权限是所有用户。
2.格式free [-b|-k|-m] [-o] [-s delay] [-t] [-V]
3.主要参数-b -k -m:分别以字节(KB、MB)为单位显示内存使用情况。
-s delay:显示每隔多少秒数来显示一次内存使用情况。
-t:显示内存总和列。
-o:不显示缓冲区调节列。
4.应用实例free命令是用来查看内存使用情况的主要命令。和top命令相比,它的优点是使用简单,并且只占用很少的系统资源。通过-S参数可以使用free命令不间断地监视有多少内存在使用,这样可以把它当作一个方便实时监控器。
#free -b -s5使用这个命令后终端会连续不断地报告内存使用情况(以字节为单位),每5秒更新一次。
android手机测试中如何查看内存泄露的更多相关文章
- Android中如何查找内存泄露
1.首先确定是否有内存泄露及哪个程序造成. 1.1.内存泄露已弹出out of memory对话框的情况. 这种情况很简单,直接看对话框就知道是哪个应用的问题了.然后再分析该应用是否是因为内存泄露造成 ...
- Android学习系列(37)--App调试内存泄露之Context篇(下)
接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...
- 对开发中常见的内存泄露,GDI泄露进行检测
对开发中常见的内存泄露,GDI泄露进行检测 一.GDI泄露检测方法: 在软件测试阶段,可以通过procexp.exe 工具,或是通过任务管理器中选择GDI对象来查看软件GDI的对象是使用情况. 注意点 ...
- iPhone应用中如何避免内存泄露?
如何有效控制iPhone内存管理的对象的所有权与引用计数和以及iPhone内存的自动释放与便捷方法.本文将介绍在iPhone应用中如何避免内存泄露.想了解“在iPhone应用中如何避免内存泄露”就必须 ...
- Java宝典(四)------Java中也存在内存泄露。
--Java中会存在内存泄露吗? --如果你想当然的以为Java里有了垃圾回收机制就不会存在内存泄露,那你就错了. Java里也会存在内存泄露! 我们慢慢来分析. 所谓内存泄露就是指一个不再被程序使用 ...
- Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息
Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息 by:授客 QQ:1033553122 1. 查看内存信息 1)查看所有内存信息 命令: dumpsys mem ...
- Android中如何查看内存
文章参照自:http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-a ...
- Android中如何查看内存(上)
文章参照自:http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-a ...
- Android开发中常见的内存泄露案例以及解决方法总结
1.单例模式引起的内存泄露 由于单例模式的静态特性,使得它的生命周期和我们的应用一样长,如果让单例无限制的持有Activity的强引用就会导致内存泄漏如错误代码示例: public class Use ...
随机推荐
- Java笔记(十一)通用容器类和总结
通用容器类和总结 一.抽象容器类 一)AbstractCollection 提供了Collection接口的基础实现,具体来说,实现了如下方法: public boolean addAll(Colle ...
- 2955 ACM 杭电 抢银行 01背包 乘法
题意: 强盗抢银行,在不被抓住的情况下,想尽量多的偷点钱.已知各个银行的金钱和被抓的概率,以及强盗能容忍的最大不被抓的概率(小于等于该概率才能不被抓),求最多能抢到钱? 并不是简单的01背包问题? 1 ...
- javaScript中with函数用法实例分析
javaScript 中的 with 函数 ,即所谓的with 语句,可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性,要给对象创建新的属性,必须明确地引用该对象. with 函 ...
- Dijkstra求次短路
#10076.「一本通 3.2 练习 2」Roadblocks:https://loj.ac/problem/10076 解法: 次短路具有一种性质:次短路一定是由起点到点x的最短路 + x到y的距离 ...
- 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第4章编程练习1
#include <iostream>//#include <string>using namespace std;struct stu{ char fname[10];//这 ...
- HTTP断点续传
一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Conten ...
- Java 接口 Comparable
compareTo方法是Comparable接口中唯一的方法.类实现了该接口后表明它的实例具有内在的排序关系.当该对象小于.等于或大于指定对象的时候,分别返回一个负整数.0或者正整数.如果由于指定对象 ...
- mysql5.7.20完全卸载 win10
试了好多方法,搞了很久终于完全卸载干净,重装完成了! 1.关闭服务 以管理员身份运行cmd,执行以下命令: C:\WINDOWS\system32>net stop mysql MySQL 服务 ...
- win7 64位安装Dlib19.6版本的过程记录
本文为原创,未经允许不得转载. 1.去Dlib的官网下载dlib-19.6的源文件.然后解压到Myprograms下的Res文件夹下 2.到CMake的官网下载Cmake,我下载以后解压,然后进入到b ...
- HTML5 学习05—— 拖放(Drag 和 Drop)
拖放(Drag 和 drop)是 HTML5 标准的组成部分.即抓取对象以后拖到另一个位置. 例:将w3cschool图标拖动到矩形框中. <script> function allowD ...