hprof文件分析工具_MAT工具排查内存泄漏

文章转载自http://blog.csdn.net/aaa2832/article/details/19419679

1.1 观察 Heap

运行程序,然后进入 DDMS管理界面,如下:

66465380ff716cda7b2f7db23b568005.png

PS : 点击工具栏来更新统计信息

点击右侧的 Cause GC 按钮即可查看当前的堆情况,如下:

e061f204286130150eecaf4d29f55e27.png

主要关注两项数据:

Heap Size 堆的大小,当资源增加,当前堆的空余空间不够时,系统会增加堆的大小,若超过上限 (例如 64M,视平台和具体机型而定)则会被杀掉。

Allocated 堆中已分配的大小,这是应用程序实际占用的内存大小,资源回收后,此项数据会变小。

查看操作前后的堆数据,看是否有内存泄漏
对单一操作(比如添加页,删除页)进行反复操作,如果堆的大小一直增加,则有内存泄漏的隐患。

1.2 利用MAT分析内存堆

DDMS 可以将当前的内存 Dump成一个 hprof格式的文件,MAT 读取这个文件后会给出方便阅读的信息,配合它的查找,对比功能,就可以定位内存泄漏的原因。

获取 hprof文件
点击工具栏上的 按钮,将内存信息保存成文件。 如果是用 MAT Eclipse 插件获取的 Dump文件,则不需要经过转换,Adt会自动进行转换然后打开。

转换 hprof文件
DDMS Dump 出的文件要经过转换才能被 MAT识别,Android SDK提供了这个工具 hprof-conv (位于 sdk/tools下)

 ./hprof-conv xxx-a.hprof xxx-b.hprof
28c256939463424f8b1291d22d79c5d5.png

用 MAT打开转换后的 hprof文件

Leak suspects

f0993882e3a1e34a97e4b1493020af79.png
c1dc61416771651f12685dc29f3a1555.png
6925c9fe46431bb9395bd15067e503aa.png

1.3 Histogram 查询

用的最多的功能是 Histogram,点击 Actions下的 Histogram项将得到 Histogram结果:

e1f99a1ca5cbb620fd8727a22341fc2c.png

它按类名将所有的实例对象列出来,可以点击表头进行排序,在表的第一行可以输入正则表达式来匹配结果 :

17f9519cfe6b5b9525903d38c0827cb5.png

在某一项上右键打开菜单选择 list objects ->with incoming refs 将列出该类的实例:

21d9d248365f386c3a046d62873c67ac.png

它展示了对象间的引用关系,比如展开后的第一个子项表示这个 HomePage(0x420ca5b0)被 HomePageContainer(0x420c9e40)中的 mHomePage属性所引用.

快速找出某个实例没被释放的原因,可以右健 Path to GC Roots-->exclue all phantom/weak/soft etc. reference :

6a7a83a99d745a4c5d79d2ba03a8b53a.png

得到的结果是:

797c74e00035eb3f2da03be743b3644d.png

从表中可以看出 PreferenceManager -> … ->HomePage这条线路就引用着这个 HomePage实例。用这个方法可以快速找到某个对象的 GC Root,一个存在 GC Root的对象是不会被 GC回收掉的.

1.4 Histogram 对比

为查找内存泄漏,通常需要两个 Dump结果作对比,打开 Navigator History面板,将两个表的 Histogram结果都添加到 Compare Basket中去 :

1f42c57ed72f38c6d9699cc9074edabc.png

添加好后,打开 Compare Basket面板,得到结果:

06f25cb193194c7757ccf8125733d081.png

点击右上角的 ! 按钮,将得到比对结果:

375af5e5b927c240801df7011945770e.png

注意,上面这个对比结果不利于查找差异,可以调整对比选项:

0cd92798d6841cb4c660003f341a94dc.png

再把对比的结果排序,就可得到直观的对比结果:

2d548f9d6d6e12cc48e0969626f66b15.png

也可以对比两个对象集合,方法与此类似,都是将两个 Dump结果中的对象集合添加到Compare Basket中去对比。找出差异后用 Histogram查询的方法找出 GC Root,定位到具体的某个对象上。

1.5 Dominator Tree视图

点击工具栏上的 图标可以打开Dominator Tree(支配树)视图,在此视图中列出了每个对象(Object Instance)与其引用关系的树状结构,同时包含了占用内存的大小和百分比。

6fc2d5c2ee3b7a761bc96670f216b415.png

通过Dominator Tree视图可以很容易的找出占用内存最多的几个对象(根据Retained Heap或Percentage排序),和Histogram类似,可以通过不同的方式进行分组显示:

6e3988ba221b94de245e1f87baf7022e.png

转载http://blog.csdn.net/aaa2832/article/details/19419679

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mac hprof 内存分析工具是一种用于分析 Java 应用程序内存使用情况的工具。它通过捕获 Java 虚拟机的堆转储文件(hprof 文件)来提供详细的分析报告和图形化界面,帮助开发人员识别和解决内存泄漏、内存溢出等内存相关问题。 使用 Mac hprof 内存分析工具,我们可以查看应用程序中每个对象的实际大小、引用关系和分配情况。通过分析对象的存活关系,我们可以定位内存泄漏的源头,找到不再使用的对象、未经妥善释放的资源等问题。 除了基本的内存信息分析Mac hprof 内存分析工具还提供了一些有用的功能。比如,它可以生成堆转储文件的统计数据和图表,帮助开发人员更直观地了解内存使用情况。此外,它还支持生成内存泄漏报告,指导开发人员采取相应的措施修复问题。 在使用 Mac hprof 内存分析工具时,我们需要首先在 Java 虚拟机启动时启用堆转储功能,生成 hprof 文件。然后,我们可以使用 Mac hprof 工具来加载和分析这个转储文件。该工具提供了一个用户友好的界面,显示了应用程序的内存使用情况和相关统计信息。 总而言之,Mac hprof 内存分析工具是一个有用的工具,可帮助开发人员诊断和解决Java应用程序的内存相关问题。通过分析堆转储文件,我们可以深入了解内存使用情况,发现内存泄漏和资源浪费等问题,并采取相应的措施来优化应用程序的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值