内存分析工具MAT的使用.doc

上传人:w****2 文档编号:6641708 上传时间:2020-03-01 格式:DOC 页数:17 大小:1.40MB
返回 下载 相关 举报
内存分析工具MAT的使用.doc_第1页
第1页 / 共17页
内存分析工具MAT的使用.doc_第2页
第2页 / 共17页
内存分析工具MAT的使用.doc_第3页
第3页 / 共17页
点击查看更多>>
资源描述
内存分析工具MAT的使用一、MAT插件安装MAT(Memory Analyzer Tool) 是基于heap dumps来进行分析的,它的分析速度比jhat快,分析结果是图形界面显示,比java内置jhat的可读性更高,通过Eclipse市场安装 方法/步骤1打开Eclipse - help- Eclipse Marketplace2点击install,等待下面的进度条加载完毕后,勾选全部,点击Next3同意协议后,点击Finish就开始安装MAT了直接输入URL安装 方法/步骤21. 打开Eclipse - help- Install New Software2. 在work with输入图中下载地址,勾选Memory Analyzer for Eclipse IDE选项3. 若没有勾选Memory Analyzer for Eclipse IDE选项,点击地址栏旁边的Add,在location里输入以上地址,点击OK即可。4. 安装完成后提示重启Eclipse,重启后打开window - open perspective,看到Memory Analysis证明安装成功。二、MAT的使用案例一问题线上某一台机器出现异常.接口调用的rt达到了万级别.基本可以判断这个机器已经挂了.进而分析该机器一直在fgc.然后马上dump内存,进而进行分析(中间一些异常的gc日志没有截图).之前学习的jvm知识都是纯理论的,这次是实打实线上出现的问题.所以记录一下.步骤1 、先dump对应的堆,然后从线上发到自己本机 dump的命令是jmap -dump:format=b,file=heap.bin 2、调整eclipse的内存 具体的数值,需要看dump的文件大小.比如我的dump文件是1.3G,我就给了eclipse 2G的内存.据说有些dump文件有几十个G的大小,那么分析的机器也必须比这个大才行,否则eclipse本身就OOM了.3、分析. 调整到 Memory Analysis 窗口,然后File-Open Heap Dump然后选择dump的文件,然后MAT就自动会进行分析.分析完了,直接查看 Leak Suspects Report . MAT会自动帮你找内存泄露的疑凶.然后给你点下面的Detail .可以看到最直观的类和所占用的大小可以看到, IosPushClient 的直接引用是40byte 但是对应的间接引用达到了恐怖的420M 那么再点击该类,list obejcts .重点看间接引用占用的大的可以看到这个LinkedHashMap中,有47528个1776byte的对象。其实看到这里,就基本清楚了.这个是由于在push的时候把对应的push消息给保留住,然后造成一直堆积在内存中造成的。解决办法: 在不修改对应的push底层实现的前提下,每次push了2W条消息就清理一次.后续有时间再修改底层逻辑吧.案例二1内存泄漏的排查方法Dalvik Debug Monitor Server (DDMS)是ADT插件的一部分,其中有两项功能可用于内存检查: heap查看堆的分配情况 allocation tracker跟踪内存分配情况DDMS这两项功能有助于找到内存泄漏的操作行为。Eclipse Memory Analysis Tools (MAT)是一个分析Java堆数据的专业工具,用它可以定位内存泄漏的原因。工具地址:https:/www.eclipse.org/mat/1.1观察Heap 运行程序,然后进入DDMS管理界面,如下:PS :点击工具栏上的来更新统计信息点击右侧的Cause GC按钮或工具栏上的即可查看当前的堆情况,如下:主要关注两项数据:o Heap Size堆的大小,当资源增加,当前堆的空余空间不够时,系统会增加堆的大小,若超过上限(例如64M,视平台和具体机型而定)则会被杀掉o Allocated堆中已分配的大小,这是应用程序实际占用的内存大小,资源回收后,此项数据会变小 查看操作前后的堆数据,看是否有内存泄漏对单一操作(比如添加页,删除页)进行反复操作,如果堆的大小一直增加,则有内存泄漏的隐患。1.2 利用MAT分析内存堆DDMS可以将当前的内存Dump成一个hprof格式的文件,MAT读取这个文件后会给出方便阅读的信息,配合它的查找,对比功能,就可以定位内存泄漏的原因。 获取hprof文件点击工具栏上的按钮,将内存信息保存成文件。如果是用MAT Eclipse插件获取的Dump文件,则不需要经过转换,Adt会自动进行转换然后打开。 转换hprof文件DDMS Dump出的文件要经过转换才能被MAT识别,AndroidSDK提供了这个工具hprof-conv(位于sdk/tools下)./hprof-conv xxx-a.hprof xxx-b.hprof 用MAT打开转换后的hprof文件1.3 Histogram 查询用的最多的功能是Histogram,点击Actions下的Histogram项将得到Histogram结果:它按类名将所有的实例对象列出来,可以点击表头进行排序,在表的第一行可以输入正则表达式来匹配结果:在某一项上右键打开菜单选择list objects -with incoming refs将列出该类的实例:它展示了对象间的引用关系,比如展开后的第一个子项表示这个HomePage(0x420ca5b0)被HomePageContainer(0x420c9e40)中的mHomePage属性所引用.快速找出某个实例没被释放的原因,可以右健Path to GC Roots-exclue all phantom/weak/soft etc. reference:得到的结果是:从表中可以看出PreferenceManager - -HomePage这条线路就引用着这个HomePage实例。用这个方法可以快速找到某个对象的GC Root,一个存在GC Root的对象是不会被GC回收掉的.1.4 Histogram 对比为查找内存泄漏,通常需要两个Dump结果作对比,打开Navigator History面板,将两个表的Histogram结果都添加到Compare Basket中去:添加好后,打开Compare Basket面板,得到结果:点击右上角的!按钮,将得到比对结果:注意,上面这个对比结果不利于查找差异,可以调整对比选项:再把对比的结果排序,就可得到直观的对比结果:也可以对比两个对象集合,方法与此类似,都是将两个Dump结果中的对象集合添加到Compare Basket中去对比。找出差异后用Histogram查询的方法找出GC Root,定位到具体的某个对象上。1.5 例子举例一个典型的分析内存泄漏的过程:1.使用Heap查看当前堆大小为23.00M2.添加一个页后堆大小变为23.40M3.将添加的一个页删除,堆大小为23.40M4.多次操作,结果仍相似,说明添加/删除页存在内存泄漏(也应注意排除其它因素的影响)5. Dump出操作前后的hprof文件(1.hprof,2.hprof),用mat打开,并得到histgram结果6.使用HomePage字段过滤histgram结果,并列出该类的对象实例列表,看到两个表中的对象集合大小不同,操作后比操作前多出一个HomePage,说明确实存在泄漏7.将两个列表进行对比,找出多出的一个对象,用查找GC Root的方法找出是谁串起了这条引用线路,定位结束PS : 很多时候堆增大是Bitmap引起的,Bitmap在Histogram中的类型是byte ,对比两个Histogram中的byte对象就可以找出哪些Bitmap有差异 多使用排序功能,对找出差异很有用2 内存泄漏的原因分析总结出来只有一条:存在无效的引用!良好的模块设计以及合理使用设计模式有助于解决此问题。3 Tips 使用android:largeHeap=true标记(API Level = 11)在AndroidManifest.xml中的Application节点中声明即可分配到更大的堆内存, android:largeHeap标记在Android系统应用中也有广泛的应用,比如Launcher, Browser这些内存大户上均有使用.三、MAT参考文献 DDMS官方教程 http:/developer.android.com/tools/debugging/ddms.html MAT下载http:/www.eclipse.org/mat/downloads.php MAT使用http:/android-developers.blogspot.tw/2011/03/memory-analysis-for-android.html
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 临时分类 > 人文社科


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!