前言:之前一篇博客写了一些关于leakcanary的了解,除此之外还从其他博客上看到有个有类似功能的工具,叫做Memory Analysis Tool,简称MAT,体验一下,看下这两个工具有什么差别。

 

参考:

1.Android内存优化(五)详解内存分析工具MAT

 

demo地址:

点击打开链接

PS:mat结果我放在上面demo的assert文件夹下了

 

1.MAT的下载安装

PS:我用的是Ubuntu 16.04 64位的系统

jiatai@jiatai:~$ uname -a
Linux jiatai 4.13.0-36-generic #40~16.04.1-Ubuntu SMP Fri Feb 16 23:25:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

下载地址:点击打开链接

打开以后如下所示,选择对应的版本就好了,我的是Ubuntu 64位的所以下载下面标注的即可。

memory profiling tools 怎样使用 memory analysis tools_Ubuntu

 

下载好了是一个压缩包,解压后如下所示:

memory profiling tools 怎样使用 memory analysis tools_memory analysis tool_02

我直接运行红框框出的执行文件,然后界面不好很友好,看不出如何操作。

memory profiling tools 怎样使用 memory analysis tools_MAT_03

这个先不管。。。反正安装好了,后面如何用后面接着讲。

 

2. hprof文件的生成

hprof生成主要分为3步

1)可执行的apk

2)多次运行apk用ddms抓取不标准的hprof文件

3)用sdk工具将hprof转换为标准的hprof文件

 

2.1 编写测试demo

 

 

随便写一个内存泄露的类,对应代码已上传至点击打开链接

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new matThread().start();
    }

    class matThread extends Thread{
        public matThread(){
            super("matThread");
        }

        @Override
        public void run() {
            super.run();
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 

然后编译出apk,装在手机上。

 

 

2.2 获取非标准hprof文件

打开Androidstudio中的Toos-Android-Android Device Monitor

memory profiling tools 怎样使用 memory analysis tools_memory analysis tool_04

如上图所示,显示出我们所写的apk对于的进程,然后点击那个绿颜色能量电池样式的图标,上面的提示是update heap。接着旋转手机多次,旋转完成后点击刚才图标右边的Dump HPROF file即可得到不标准的hprof文件。

memory profiling tools 怎样使用 memory analysis tools_Ubuntu_05

 

2.3 转换为标准的hprof文件

DDMS生成的hprof文件并不是标准的,还需要将它转换为标准的hprof文件,这样才会被MAT识别从而进行分析,可以使用SDK自带的hprof-conv进行转换,它的路径在sdk/platform-tools中,进入到该路径执行以下语句即可:

memory profiling tools 怎样使用 memory analysis tools_MAT_06

 

3. 使用MAT工具

由于我发现直接打开MAT工具貌似不知道怎么下手,然后我突发奇想用命令行试了下,我发现可以的。

memory profiling tools 怎样使用 memory analysis tools_Ubuntu_07

 

打开界面如下所示:

memory profiling tools 怎样使用 memory analysis tools_memory analysis tool_08

选择Leak Suspects Report,接着点击Finish。

得到如下分析结果

memory profiling tools 怎样使用 memory analysis tools_memory analysis tool_09

比如说我们想看内存泄露,就看标注的Leak Suspects,其中有对内存泄露对应的假设。 点击一下然后会在和hprof相同目录下生成如下文件:

memory profiling tools 怎样使用 memory analysis tools_Android_10

解压查看其中的HTML即可。

memory profiling tools 怎样使用 memory analysis tools_memory analysis tool_11

HTML如下所示,详情可以点击details,然后针对问题分析:

memory profiling tools 怎样使用 memory analysis tools_Android_12

好吧,其实就我写的demo,这个分析结果貌似没什么用。

我偷偷用了下mat的查看线程功能,看到我自己自定义的线程启动了很多次,这个也是正常的,每次旋转activity重新创建会带动Thread重新启动一下,但是非静态内部类会持有activity的引用造成activity无法回收。这是个失败的演示=-=

memory profiling tools 怎样使用 memory analysis tools_memory analysis tool_13

 

4.总结

MAT其实挺有用的,我除了体验了下leak suspect,其他基本能点的我都点了下,体验了下大致作用,感觉还是个很好的分析内存占用的工具。