前言:之前一篇博客写了一些关于leakcanary的了解,除此之外还从其他博客上看到有个有类似功能的工具,叫做Memory Analysis Tool,简称MAT,体验一下,看下这两个工具有什么差别。
参考:
1.Android内存优化(五)详解内存分析工具MAT
demo地址:
点击打开链接
PS:mat结果我放在上面demo的assert文件夹下了
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位的所以下载下面标注的即可。
下载好了是一个压缩包,解压后如下所示:
我直接运行红框框出的执行文件,然后界面不好很友好,看不出如何操作。
这个先不管。。。反正安装好了,后面如何用后面接着讲。
hprof生成主要分为3步
1)可执行的apk
2)多次运行apk用ddms抓取不标准的hprof文件
3)用sdk工具将hprof转换为标准的hprof文件
随便写一个内存泄露的类,对应代码已上传至点击打开链接
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,装在手机上。
打开Androidstudio中的Toos-Android-Android Device Monitor
如上图所示,显示出我们所写的apk对于的进程,然后点击那个绿颜色能量电池样式的图标,上面的提示是update heap。接着旋转手机多次,旋转完成后点击刚才图标右边的Dump HPROF file即可得到不标准的hprof文件。
DDMS生成的hprof文件并不是标准的,还需要将它转换为标准的hprof文件,这样才会被MAT识别从而进行分析,可以使用SDK自带的hprof-conv进行转换,它的路径在sdk/platform-tools中,进入到该路径执行以下语句即可:
由于我发现直接打开MAT工具貌似不知道怎么下手,然后我突发奇想用命令行试了下,我发现可以的。
打开界面如下所示:
选择Leak Suspects Report,接着点击Finish。
得到如下分析结果
比如说我们想看内存泄露,就看标注的Leak Suspects,其中有对内存泄露对应的假设。 点击一下然后会在和hprof相同目录下生成如下文件:
解压查看其中的HTML即可。
HTML如下所示,详情可以点击details,然后针对问题分析:
好吧,其实就我写的demo,这个分析结果貌似没什么用。
我偷偷用了下mat的查看线程功能,看到我自己自定义的线程启动了很多次,这个也是正常的,每次旋转activity重新创建会带动Thread重新启动一下,但是非静态内部类会持有activity的引用造成activity无法回收。这是个失败的演示=-=
MAT其实挺有用的,我除了体验了下leak suspect,其他基本能点的我都点了下,体验了下大致作用,感觉还是个很好的分析内存占用的工具。