内存及cpu占用测试方法小结

  • micro cpu monitor

功能——Cpu 实时监控工具,可运行在模拟器、真机上。

优点:实时、可与应用程序同时在前台展现

 可在屏幕底部查看,仅占一个像素,application前台运行,Rd或者qa可以在调试、测试过程中实时看到设备cpu占用率,更容易定位问题所在,可配合自动化工具使用。

  •  MemoryTest

 功能:内存监控

实时监控+数据存储

优点:实时,曲线图

实时展现applition内存占用,并将数据以excel形式备份。

可配合monkey或者自动化工具使用。

缺点:数据存储格式不利于展现。 

  • DDMS+MAT

DDMS——内存泄露检测

功能:内存检测工具。使用DDMS的Heap视图工具可以很方便的确认我们的程序是否存在内存泄漏的可能性

启动DDMS

1、启动eclipse后,切换到DDMS透视图,并确认Devices视图、Heap视图都是打开的;

2、点击选中想要监测的进程——>选中视图页面上方的"update heap"图标 

3、点击Heap视图中的“Cause GC”按钮此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况 

如何判断内存泄露?

   点击“start gc”后无需重复点击刷新,heap视图会定时刷新。

   Heap视图中部有一个Type叫做data object,即数据对象,也就是我们的程序中大量存在的类类型的对象。在data object一行中有一列是“Total Size”,其值就是当前进程中所有Java数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。可以这样判断:

a) 不断的操作当前应用,同时注意观察data object的Total Size值;

b) 正常情况下Total Size值都会稳定在一个有限的范围内,也就是说由于程序中的的代码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对象,而在虚拟机不断的进行GC的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;

c) 反之如果代码中存在没有释放对象引用的情况,则data object的Total Size值在每次GC后不会有明显的回落,随着操作次数的增多Total Size的值会越来越大 

注意:ddms只可以初步判断可能存在内存泄露,哪里存在内存泄露是无从分析的,只能借助下面工具——MAT. 

  • MAT——定位内存泄露

Mat是一个eclipse plugin(http://download.eclipse.org/mat/1.1/update-site/),也有单独的rcp客户端。以下示例环境——mat plugin+eclipse

启动MAT,加载生成的hprof文件。即点击DDMS工具条上面的Dump hprof文件 

展示类实例的直方图(未释放的类实例)及说明(为什么没有释放)

overview中中查看domintor tree,查看未释放、可排序的、占用内存最大的一些对象列表。 

选中列表展开比较大的对象,右键List Objects > with incoming references。它会生成一个heap上的所有byte数组的列表,在列表里,我们可以按照Shallow Heap的使用情况来排序;

右键path to GC Roots>exclude weak/soft  references,它将展示从根到这个对象的路径--就是一条保证对象有效的链条。

根据以上路径定位内存泄露的位置。 

补充:

Shallow size就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和 

retained size:该对象本身的shallow size加上它直接引用或者间接引用的对象的shallow size,即该对象被gc回收,所能回收的内存总和。 

AndroidPermanceTest+Monkey 

http://wiki.babel.baidu.com/twiki/bin/view/Com/Test/Android%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7 

结语

以上工具均可配合monkey、自动化用例使用。

你可能感兴趣的:(转载)