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