Android MAT 内存分析工具

MemoryAnalizer 它是一个 Eclipse 推出的内存分析工具,简称 MAT(Memory Analizer Tool)

我们可以通过它的帮助找出内存泄漏,并且减少内存的消耗。

Eclipse 中使用 MAT

首先在 Eclipse 中装上该插件,步骤如下:

1,下载插件,地址如下: http://www.eclipse.org/mat/downloads.php

2,下载完成后可以在 Eclipse 中安装

 

首先编写一个简单的程序来测试内存泄漏:

public class Main {
    /**
     * @param args
     */
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        while (1<2){
            list.add("OutOfMemoryError soon");
        }

    }

}

然后单击右键 , Run Configurations 弹出如下对话框,把红色标注的内容添上去。

-XX:+HeapDumpOnOutOfMemoryError


然后单击 Run ,运行完成后,控制台出现如下信息:

然后刷新工程发现出现一个以 hprof 结尾的文件,如下所示:

然后通过插件将其打开,但是我们的插件不知道为什么打不开,总是报错,最后在网上找答案,建议使用 RCP(Rich Client Platform,胖客户端平台)

可以到官网上去下载:http://www.eclipse.org/mat/downloads.php

下载成功后解压,打开 MemoryAnalyzer.exe 文件


 


然后通过该工具打开我们生成的 hprof 文件。更详细内容参考:

  • http://wiki.eclipse.org/index.php/MemoryAnalyzer#Getting_Started
  • http://www.blogjava.net/rosen/archive/2010/06/13/323522.html

 

在 Android 使用 MAT 插件

Dalvik 虚拟机在运行的的时候,也有垃圾回收机制,但是这不意味着我们可以忽略内存的管理,我们应该更加关心手机设备的内存的使用,因为手机的内存比较紧张.在这篇文章里面,我们将要看看一些在android SDK中的内存描绘的工具,帮助我们调整应用程序内存的使用.
一些内存的使用问题是比较明显的,例如,你的应用程序在用户每次触摸屏幕都出现内存泄漏,这可能触发OutofMemoryError异常,并且程序崩溃了.其他的内存泄漏问题比较微妙了,可能仅仅导致应用程序(垃圾回收次数更加频繁并且花费时间更长)和系统执行效率下降,
Android SDK 提供了两种主要的方式来描述程序内存的使用:Allocation Tracke(in DDMS[Dalvik Debug Monitor Service])和 heap dumps.


当我们想获取什么类型的分配将会发生在一个给定的时间段内,但是他不会给我们任何关于应用程序堆的所有状态信息。

更多关于Allocation Traker的信息请查看 http://developer.android.com/resources/articles/track-mem.html

接下来我们将把焦点放在 heap dumps 上面,它是一个更加强大的内存分析工具。

一个 heap dumps 是一个应用程序堆的快照,它被存放在一个格式叫 HPORF 的二进制文件里,Dalvik 使用这个格式是类似的,但是不同于 HPROF tool in Java.
这里有一些生成一个正在运行的 android 程序的 heap dumps.一种是使用 Dump HPROF file 按钮在 DDMS 里


如果我们想更加精确的知道什么时候 dump 被创建,我们能够使用 android.os.Debug.dumpHprofData() 方法以编程的方式来创建 deap dump

分析一个 heap dump,可以使用标准的工具像 Jhat 或者 MAT

然后,第一步需要转换  .hprof 文件格式从 Dalvik 格式到 JavaSE HPROF 格式。可以使用 Android SDK 中的 hprof-conv 工具,在 cmd 命令行里输入该命令,使用格式如下:hprof-conv in.hprof out.hprof

下面通过一个例子来讲解,先创建一个Activity:

public class MainActivity extends Activity {
    static ArrayList<Pilot> list = new ArrayList<Pilot>();//定义一个集合,如果在实际程序可能就是当作缓存了.
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        for (int i = 0; i < 2000; i++) {//在里面添加2000个对象.
            list.add(new Pilot("dsfdsgdgdgvfgdsfsd",i));
        }
    }
}

然后启动该程序,在 DDMS 中 Device 面板里面可以看到该程序的进程.

接下来介绍一下这几个按钮的作用:

 


单击我们程序的进程,然后单击 update heap 按钮,右边的面板可能会出现如下图所示的内容,如果不出现单击 Cause GC.


在此基础上创建一个 heap dump,在 Devices 工具栏里面有一个 Dump HPROF file 按钮,单击该按钮就会弹出 hprof 文件保存的路径(在此之前要保证我们选中的是我们程序的进程),然后选择一个路径保存即可.

接着通过 hprof-conver 命令转换一下格式即可。最后我们通过安装的插件或者RCP打开即可。

我这里是用过 RCP 打开的.如图所示:

我们还可以打开 Histogram View,所在位置如图所示:


打开结果如下图所示:


我们在 Activty 创建了 2000 个 Pilot 对象在这里都有显示。并且还支持对象个数,shallow heap 表示所有对象占用的内存大小 ,retained heap 表示保持这些对象存活,还包括其他对象对它们引用所需要的内存。


参考文档

http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html

http://kohlerm.blogspot.com/2010/02/android-memory-usage-analysis-slides.html

http://kohlerm.blogspot.com/2009/07/eclipse-memory-analyzer-10-useful.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiclaim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值