`
yidongkaifa
  • 浏览: 4057898 次
文章分类
社区版块
存档分类
最新评论

Android初级教程_内存分析工具MemoryAnalizer

 
阅读更多
MemoryAnalizer它是一个Eclipse推出的内存分析工具(Memory Analizer Tool)简称MAT
我们可以通过它的帮助找出内存泄漏,并且减少内存的消耗.
要想使用它首先要在Eclipse中装上该插件,步骤如下:
1>,首先下载插件,地址如下:http://www.eclipse.org/mat/downloads.php

2>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文件





在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(http://docs.oracle.com/javase/6/docs/technotes/tools/share/jhat.html)
或者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(保持这些对象存活,还包括其他对象对它们引用所需要的内存.)的排序列表.
调试内存泄漏,有时候是有用的在一个不同的时间点去比较堆的状态,这需要我们创建两份HPROF文件,
那么如何去比较两个heap dumps在MAT里(这有一点点复杂)?
1>打开第一个HPROF文件(单击file-->Open Heap Dump)
2>打开Histogram View
3>....
  1. Open the first HPROF file (usingFile > Open Heap Dump).
  2. Open the Histogram view.
  3. In the Navigation History view (useWindow > Navigation Historyif it's not visible), right click onhistogramand selectAdd to Compare Basket.
  4. Open the second HPROF file and repeat steps 2 and 3.
  5. Switch to the Compare Basket view, and clickCompare the Results(the red "!" icon in the top right corner of the view).

Conclusion

In this article, I've shown how the Allocation Tracker and heap dumps can give you get a better sense of your application's memory usage. I also showed how The Eclipse Memory Analyzer (MAT) can help you track down memory leaks in your app. MAT is a powerful tool, and I've only scratched the surface of what you can do with it. If you'd like to learn more, I recommend reading some of these articles:











分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics