如何对 Android 应用进行性能分析

记录一下自己在使用DDMS的过程:开启AS,打开并运行项目  找到TOOL/选择Android Device Monitor

一款 App 流畅与否安装在自己的真机里,玩几天就能有个大概的感性认识。不过通过专业的分析工具可以使我们更好的分析我们的应用。而在实际开发中,我们解决完当前应用所有 bug 后,就会开始考虑到新能的优化。如果不考虑使用其他第三方性能分析工具的话,我们可以直接使用 ddms 中的工具,其实 ddms 工具已经非常的强大了。ddms 中有 traceview、heap、allocation tracker 等工具都可以帮助我们分析应用的方法执行时间效率和内存使用情况。

traceview

TraceView 简介

Traceview 是 Android 平台特有的数据采集和分析工具,它主要用于分析 Android 中应用程序的 hotspot(瓶颈)。Traceview 本身只是一个数据分析工具,而数据的采集则需要使用 AndroidSDK 中的 Debug 类或者利用 DDMS 工具。 
二者的用法如下: 
开发者在一些关键代码段开始前调用 Android SDK 中 Debug 类的startMethodTracing 函数,并在关键代码段结束前调用 stopMethodTracing 函数。 这两个函数运行过程中将采集运行时间内该应用所有线程(注意,只能是 Java 线程)的函数执行情况,并将采集数据保存到/mnt/sdcard/下的一 
个文件中。开发者然后需要利用 SDK 中的 Traceview 工具来分析这些数据。 
借助 Android SDK 中的 DDMS 工具。DDMS 可采集系统中某个正在运行的进程的函数调用信息。对开发者而言,此方法适用于没有目标应用源代码的情况。DDMS 工具中 Traceview 的使用如下图 

点击上图中所示按钮即可以采集目标进程的数据。当停止采集时,DDMS 会自动触发 Traceview 
工具来浏览采集数据。 
下面,我们通过一个示例程序介绍 Traceview 的使用。界面有 4 个按钮,对应四个方法。

public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void method1(View view) {int result = jisuan();System.out.println(result);}private int jisuan() {for (int i = 0; i < 10000; i++) {System.out.println(i);}return 1;}public void method2(View view) {SystemClock.sleep(2000);}public void method3(View view) {int sum = 0;for (int i = 0; i < 1000; i++) {sum += i;}System.out.println("sum=" + sum);}public void method4(View view) {Toast.makeText(this, "" + new Date(), 0).show();}
}

我们分别点击按钮一次,要求找出最耗时的方法。点击前通过 DDMS 启动 Start Method Profiling按钮。 
 
然后依次点击 4 个按钮,都执行后再次点击上图中红框中按钮,停止收集数据。 
接下来我们开始对数据进行分析。 
当我们停止收集数据的时候会出现如下分析图表。该图表分为 2 大部分,上面分不同的行,每一行代表一个线程的执行耗时情况。main 线程对应行的的内容非常丰富,而其他线程在这段时间内干得工作则要少得多。图表的下半部分是具体的每个方法执行的时间情况。显示方法执行情况的前提是先选中某个线程。 

我们主要是分析 main 线程。 
上面方法指标参数所代表的意思如下:

名称 描述
Name 该线程运行过程中所调用的函数名
Incl Cpu Time 某函数占用的CPU时间,包含内部调用其它函数的CPU时间
Excl Cpu Time 某函数占用的CPU时间,但不包含内部调用其它函数的CPU时间
Incl Real Time 某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间
Excl Real Time 某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间
Call+Recur Calls/Total 某函数被调用次数及地柜调用占总调用次数的百分比
Cpu Time/Call 某函数调用CPU时间与调用次数的比。相当于该函数的平均执行时间
Real Time/Call 同CPU Time/Call类似,只不过统计单位换成了真实时间

我们为了找到最耗时的操作,那么可以通过点击 Incl Cpu Time,让其按照时间的倒序排列。我点击后效果如下图:

通过分析发现:红色部分最耗时

heap

heap 简介

heap 工具可以帮助我们检查代码中是否存在会造成内存泄漏的地方。 
用 heap 监测应用进程使用内存情况的步骤如下: 
1.启动 eclipse 后,切换到 DDMS 透视图,并确认 Devices 视图、Heap 视图都是打开的; 
2.点击选中想要监测的进程,比如 system_process 进程; 
3.点击选中 Devices 视图界面中最上方一排图标中的“Update Heap”图标; 
4.点击 Heap 视图中的“Cause GC”按钮; 
5.此时在 Heap 视图中就会看到当前选中的进程的内存使用量的详细情况。 
说明: 
a. 点击“Cause GC”按钮相当于向虚拟机请求了一次 gc 操作; 
b. 当内存使用信息第一次显示以后,无须再不断的点击“Cause GC”,Heap 视图界面会定时刷新,在对应用的不断的操作过程中就可以看到内存使用的变化; 
c. 内存使用信息的各项参数根据名称即可知道其意思,在此不再赘述。 
如何才能知道我们的程序是否有内存泄漏的可能性呢? 
这里需要注意一个值:Heap 视图中部有一个 Type 叫做 data object,即数据对象,也就是我们的程序中大量存在的类类型的对象。在 data object 一行中有一列是“Total Size”,其值就是当前进程中所有 Java 数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。可以这样判断: 
1、 不断的操作当前应用,同时注意观察 data object 的 Total Size 值; 
2、 正常情况下 Total Size 值都会稳定在一个有限的范围内,也就是说由于程序中的的代码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对象,而在虚机不断的进行 GC 的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平; 
3、反之如果代码中存在没有释放对象引用的情况,则 data object 的 Total Size 值在每次 GC 后不会有明显的回落,随着操作次数的增多 Total Size 的值会越来越大,直到到达一个上限后导致进程被 kill 掉。 
4、此处以 system_process 进程为例,在我的测试环境中 system_process 进程所占用的内存的data object 的 Total Size 正常情况下会稳定在 2.2~2.8 之间, 而当其值超过 3.55 后进程就会被kill。 
总之,使用 DDMS 的 Heap 视图工具可以很方便的确认我们的程序是否存在内存泄漏的可能性。

allocation tracker

allocation tracker 简介

allocation tracker 是内存分配跟踪工具 
步骤: 
运行 DDMS,只需简单的选择应用进程并单击 Allocation tracker 标签,就会打开一个新的窗口,单击“Start Tracing”按钮;然后,让应用运行你想分析的代码。运行完毕后,单击“Get Allocations”按钮,一个已分配对象的列表就会出现第一个表格中。单击第一个表格中的任何一项,在表格二中就会出现导致该内存分配的栈跟踪信息。通过 allocationtracker,不仅知道分配了哪类对象,还可以知道在哪个线程、哪个类、哪个文件的哪一行。

Android 应用进行性能分析/APP/系统性能分析相关推荐

  1. php系统性能分析论文,系统性能分析-PHP/Linux@HeFei-51CTO博客

    查看系统资源占用分配情况和进程数: [root@www ~]# ps -Ao comm,pmem,pcpu --sort -rss | uniq -c | head -15 1 COMMAND     ...

  2. Android/Linux系统性能分析之-CPU

    1. 概述: CPU推动了所有软件的运行,因而通常是系统性能分析的首要目标:现代系统一般有多颗CPU,通过内核调度器共享给所有运行软件.当需求的CPU资源超过了系统力所能及的范围时,进程里的线程(或者 ...

  3. Android/Linux系统性能分析及工具

    1. CPU 1.1 CPU架构 CPU推动了所有软件的运行,因此通常是系统性能分析的首要目标.现代系统一般有多颗CPU,通过内核调度器共享给所有运行软件.当需求的CPU资源超过了系统力所能及的范围时 ...

  4. java web 性能分析_web系统性能分析JavaMelody

    JavaMelody :能够在实际运行生产环境监测Java或Java EE应用程序服务器.并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http ...

  5. sar 找出系统瓶颈的利器 目前Linux上最为全面的系统性能分析工具之一 直接 sar -dur 1 30 即可看内存 CPU和IO占用...

    12. sar 找出系统瓶颈的利器 sar是System Activity Reporter(系统活动情况报告)的缩写.sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行 ...

  6. 系统性能分析从入门到进阶

    简介:本文以系统为中心, 结合日常工作和用例, 由浅入深地介绍了性能分析的一些方法和体会, 希望对想了解系统性能分析的同学有所帮助. 作者 | 勿非 来源 | 阿里技术公众号 本文以系统为中心, 结合 ...

  7. Linux 实操 —— Linux 系统性能分析

    引言 最近配合解决压测(性能测试)方面的问题,了解到了一些可以监控 Linux 系统性能指标,如CPU.IO.内存等的工具. 此篇博客主要讲解 Linux 系统监控的一些重点内容以及 sar 命令的使 ...

  8. matlab仿真限幅发散,GSM通信系统性能分析与MATLAB仿真.doc

    GSM通信系统性能分析与MATLAB仿真.doc22页 本文档一共被下载:次,您可全文免费在线阅读后下载本文档. 下载提示 1.本站不保证该用户上传的文档完整性,不预览.不比对内容而直接下载产生的反 ...

  9. Linux系统通过Shell脚本实现一个全方面的系统性能分析系统

    Linux系统通过Shell脚本实现一个全方面的系统性能分析系统 文章目录 Linux系统通过Shell脚本实现一个全方面的系统性能分析系统 1.利用select循环实现系统工具箱 2.命令技巧 3. ...

最新文章

  1. php判断多维数组的技巧
  2. YUI Grid CSS的优雅设计(转)
  3. Beyond Compare 3 许可证密钥被撤销
  4. ajax初试,获取数据
  5. druid连接池初始化慢_从零开始手写 mybatis (三)jdbc pool 从零实现数据库连接池
  6. 【翻译】【CGWORLD】怪物猎人携带版3rd制作介绍
  7. Marketing Cloud里contact批量删除的http负载
  8. anaconda下载的python在哪_Anaconda下Python环境下载及安装
  9. 后端用java还是python_【后端开发】已学php再学java还是python?
  10. 读取usb接口数据_笔记本接口不够?无须担心!小米分线器开箱初体验
  11. 技巧:在Silverlight应用程序中操作Cookie
  12. flask从表单中的提交中获取数据(不使用第三方库)
  13. 2021-11-16-小甲鱼python教学视频总结
  14. 实战制作U盘工具去除XP系统管理员密码
  15. 浙江大学计算机程序设计能力考试(PAT)简介
  16. 国内电视台播出的日本动画大盘点
  17. SAP ABAP 字符串替换
  18. protel DXP2004批量修改
  19. Python计算某年某月某日天数
  20. RN中热更新CodePush使用

热门文章

  1. img标签 文件不存在_HTML常用标签
  2. java查询mysql装载bean_jsp与javabean链接mysql数据库并查询数据表的简单实例源码
  3. 【radar】毫米波雷达-相机-激光雷达融合相关论文汇总(特征融合、RPN融合、弱监督融合、决策融合、深度估计、跟踪)(5)
  4. FPGA(2)基础语法 -- 按键控制led(alway@语句)
  5. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)
  6. 【ios开发/Xcode】实现关键字检索
  7. linux下比较文件并输出,Linux使用diff命令比较文件找出文件之间相同的部分
  8. 数字图像处理——第九章 形态学图像处理
  9. Udacity机器人软件工程师课程笔记(十)-ROS-Catkin-包(package)和gazebo
  10. 高亮提示、聚焦控件并滚动到浏览器中干好可以查看到该控件的位置