1.Android MAT (Memory Analyzer tool)讲解:
android的内存优化是一个老生常谈的问题,也是一个高级android工程师的必备素质与技能,最近了解并实践了android内存分析工具MAT,这是一款eclipse开发的工具,可以帮助程序员们快速定位android程序中常见的内存泄漏、内存抖动、oom等问题,下面我来介绍一下用法:
首先我们打开android studio的profile工具,开启性能监控。点到`memory选项。
![](https://img.haomeiwen.com/i6656438/a24b74f1e60c0312.png)
可以看到,当我们打开页面之后,会有一个内存上升的过程,然后又下降,这是正常的(新打开activity会分配内存), 然后点击** dump java heap,会下载一个heap dump**文件(改文件记载一段时间内系统的内存情况,包括内存泄漏)
![](https://img.haomeiwen.com/i6656438/81e2c28d7d73171f.png)
点击左侧的heap dump文件下载到自己的路径下,
![](https://img.haomeiwen.com/i6656438/501154b928ddcf7c.png)
这是我们就获取hprofs文件,然后用mat打开,此时会报错,注意,这是正常的,因为现在的hprofs文件格式还有些问题,我们还需要借助另外一个工具, 打开我们的android SDK 目录,然后打开platform-tools文件夹可以看到一个hprof-conv.exe程序
windows:
![](https://img.haomeiwen.com/i6656438/9265294fef4d0ee4.png)
mac:
![](https://img.haomeiwen.com/i6656438/cea2866e77394a50.png)
这个程序是专门用来做hprof文件格式转换的,然后在此路径下打开命令行,用命令进行格式转换
格式:hprof-conv.exe [-z] infile outfile
windows:
![](https://img.haomeiwen.com/i6656438/c156fdf34f759d59.png)
Mac:
![](https://img.haomeiwen.com/i6656438/b86e1382ae151607.png)
可以看到,我们得到了最终的6.hprof文件 然后用我们的MAT 工具打开
![](https://img.haomeiwen.com/i6656438/b625ececd51806d1.png)
2.MAT工具使用介绍
选择file ---->open heap dump,定位到刚才的6.hprof文件,用工具打开标准.hprof文件后界面如下:
![](https://img.haomeiwen.com/i6656438/a7b1890f0438ae10.png)
我们主要分析Actions, 它包含了4个部分:
sdf | sdf |
---|---|
histogram | 列举内存中对象存在的个数和大小 |
Dominator tree | 该视图会以占用总内存的百分比来列举所有实例对象,注意这个地方是对象而不是类了,这个视图是用来发现大内存对象的 |
Top Consumers | 该视图会显示可能的内存泄漏点 |
Duplicate Classes | 该视图显示重复的类等信息 |
2.1 Histogram
点击Histogram之后,会出现如下界面:
![](https://img.haomeiwen.com/i6656438/d327ffb1ffcf3b37.png)
这个视图中提供了多种方式来对对象进行分类,这里为了分析方便,我们选择按包名进行分类。
下面再来解释下列名:
列名 | 含义 |
---|---|
Object | 该类在内存当中的对象个数 |
Shallow Heap | 对象自身所占用的内存大小,不包括它所引用的对象的内存大小 |
Retained Heap | 该对象被垃圾回收器回收之后,会释放的内存大小 |
我们再来看一下右键菜单选项:
![](https://img.haomeiwen.com/i6656438/b60537befa821298.png)
List objects:
![](https://img.haomeiwen.com/i6656438/33c65337bb4e32f1.png)
with outgoing references:查看它所引用的对象 with incoming references: 查看它被哪些对象引用
Show objects by class 和List objects选项类似,只不过列出的是类名。
Merge Shortest Paths to GC Roots 我们可以选择排除一些类型的引用:
![](https://img.haomeiwen.com/i6656438/4df4c0110a00addd.png)
Dominator Tree:
通过“引用树”的方式来展现内存的使用情况的,通俗点来说,它是站在对象的角度来观察内存的使用情况的,主要看是否存在异常的大内存对象
主要看是否存在异常的大内存对象:
不常用,读者可以自行使用下
Histogram 对比
为查找内存泄漏,通常需要两个 Dump结果作对比,打开 Navigator History面板,将两个表的 Histogram结果都添加到 Compare Basket中去 :
![](https://img.haomeiwen.com/i6656438/b0c46a2df4830540.png)
添加好后,打开 Compare Basket面板,得到结果:
![](https://img.haomeiwen.com/i6656438/6dd3179b8339350d.png)
点击右上角的 ! 按钮,将得到比对结果:
![](https://img.haomeiwen.com/i6656438/48508de4ed3ae2d7.png)
注意,上面这个对比结果不利于查找差异,可以调整对比选项:
![](https://img.haomeiwen.com/i6656438/c258d0012dacc989.png)
再把对比的结果排序,就可得到直观的对比结果:
![](https://img.haomeiwen.com/i6656438/b9d4c16bc52d0684.png)
也可以对比两个对象集合,方法与此类似,都是将两个 Dump结果中的对象集合添加到Compare Basket中去对比。找出差异后用 Histogram查询的方法找出GC Root,定位到具体的某个对象上。
作者:狼少丷
链接:https://www.jianshu.com/p/0c5c4ced1f59
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论