文档章节

内存分析工具MAT(MemoryAnalyzerTool)

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:39
字数 1170
阅读 19
收藏 1

如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如

果从头到尾的分析代码逻辑,那肯定会把人逼疯,特别是在维护别人写的代码的时候。这里介绍一个极好的内存分析工具

MemoryAnalyzerTool(MAT)。

MAT是一个Eclipse插件,同时也有单独的RCP客户端。官方下载地址、MAT介绍和详细的使用教程请参见:

www.eclipse.org/mat,在此不进行说明了。另外在MAT安装后的帮助文档里也有完备的使用教程。在此仅举例说明其使用方法。我

自己使用的是MAT的eclipse插件,使用插件要比RCP稍微方便一些。


使用MAT进行内存分析需要几个步骤,包括:生成.hprof文件、打开MAT并导入.hprof文件、使用MAT的视图工具分析内存。以

下详细介绍。

1.生成.hprof文件

a) 打开eclipse并切换到DDMS透视图,同时确认Devices、Heap和logcat视图已经打开了;

b) 将手机设备链接到电脑,并确保使用“USB调试”模式链接,而不是“Mass Storage“模式;

c) 链接成功后在Devices视图中就会看到设备的序列号,和设备中正在运行的部分进程;

d) 点击选中想要分析的应用的进程,在Devices视图上方的一行图标按钮中,同时选中“Update Heap”和“Dump HPROF file”两个按

钮;

e) 这是DDMS工具将会自动生成当前选中进程的.hprof文件,并将其进行转换后存放在sdcard当中,如果你已经安装了MAT插件,那

么此时MAT将会自动被启用,并开始对.hprof文件进行分析;

注意:第4步和第5步能够正常使用前提是我们需要有sdcard,并且当前进程有向sdcard中写入的权限

(WRITE_EXTERNAL_STORAGE),否则.hprof文件不会被生成,在logcat中会显示诸如

ERROR/dalvikvm(8574):hprof:can'topen/sdcard/com.xxx.hprof-hptemp:Permissiondenied.的信息。如果我们没有sdcard,或者当前进

程没有向sdcard写入的权限(如system_process),那我们可以这样做:

在当前程序中,例如framework中某些代码中,可以使用android.os.Debug中的

public static void dumpHprofData(String fileName) throws IOException方法,手动的指定.hprof文件的生成位置。例如:

xxxButton.setOnClickListener(newView.OnClickListener(){

publicvoidonClick(Viewview){

android.os.Debug.dumpHprofData("/data/temp/myapp.hprof");

......

}

}

上述代码意图是希望在xxxButton被点击的时候开始抓取内存使用信息,并保存在我们指定的位置:/data/temp/myapp.hprof,这样就

没有权限的限制了,而且也无须用sdcard。但要保证/data/temp目录是存在的。这个路径可以自己定义,当然也可以写成sdcard当中

的某个路径。

2.使用MAT导入.hprof文件

a) 如果是eclipse自动生成的.hprof文件,可以使用MAT插件直接打开(可能是比较新的ADT才支持);

b) 如果eclipse自动生成的.hprof文件不能被MAT直接打开,或者是使用android.os.Debug.dumpHprofData()方法手动生成的.hprof文

件,则需要将.hprof文件进行转换,转换的方法:将.hprof文件拷贝到PC上的/ANDROID_SDK/tools目录下,并输入命令

hprof-conv xxx.hprof yyy.hprof,其中xxx.hprof为原始文件,yyy.hprof为转换过后的文件。转换过后的文件自动放

在/ANDROID_SDK/tools目录下。OK,到此为止,.hprof文件处理完毕,可以用来分析内存泄露情况了。

c) 在Eclipse中点击Windows->OpenPerspective->Other->MemoryAnalyzer,或者打MemoryAnalyzerTool的RCP。在MAT中点击File-

>OpenFile,浏览并导入刚刚转换而得到的.hprof文件。

3.使用MAT的视图工具分析内存

导入.hprof文件以后,MAT会自动解析并生成报告,点击DominatorTree,并按Package分组,选择自己所定义的Package类点右

键,在弹出菜单中选择Listobjects->Withincomingreferences。这时会列出所有可疑类,右键点击某一项,并选择PathtoGCRoots-

>excludeweak/softreferences,会进一步筛选出跟程序相关的所有有内存泄露的类。据此,可以追踪到代码中的某一个产生泄露的

类。

具体的分析方法在MAT的官方网站和客户端的帮助文档中有十分详尽,使用MAT分析内存查找内存泄漏的根本思路,就是找到哪个

类的对象的引用没有被释放,找到没有被释放的原因,也就可以很容易定位代码中的哪些片段的逻辑有问题了。



本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/23210103

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
Eclipse中安装MemoryAnalyzer插件及使用

Eclipse中安装MemoryAnalyzer插件 一、简介   Eclipse作为JAVA非常好用的一款IDE,其自带的可扩展插件非常有利于JAVA程序员的工作效率提升。   MemoryAnalyzerTool(也叫MAT)是一款JAVA虚...

gdy
2017/08/02
0
0
windows server 2008 环境下,运行java程序,内存耗尽问题

经历的几天的分析,希望把自己学到的知识总结一下。 系统版本:Windows Server 2008 R2 Standard 系统类型:64bit 内存:32GB 程序:在系统上部署了solr,然后写5个线程不停的向solr查询。 ...

小叮当_加V
2016/11/02
446
0
使用 Eclipse Memory Analyzer 进行堆转储文件分析

简介: Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减...

红薯
2010/07/26
1K
0
Android studio Android Monitor介绍一

一、Memory 这个模块包括4个功能,分别是Enabled,Initiate GC,Dump Heap JAVA,Start Allocation Tracking.。对应面板的上的4个按钮: 1.Enabled Memory的开关。如果选择关闭,则不对当前进程...

指尖上的开源
2016/01/30
15.1K
0
使用mat命令行分析heapdump

Mat是分析java堆栈的利器,与jdk自带的工具比较,分析快,占用内存少,各种图形显示有利于定位问题。 但是在真正的线上环境内存配置都比较大,目前上午笔记本内存配置是4G,无法分析线上应用...

yingtju
2018/06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部