Android 进阶——性能优化之借助adb shell ps /top 指令详细分析进程 admin 2023-02-14 04:18:02 篇首语:本文由小编为大家整理,主要介绍了Android 进阶——性能优化之借助adb shell ps /top 指令详细分析进程相关的知识,希望对你有一定的参考价值。 文章大纲 引言一、adb shell ps 查看进程状态1、基本语法2、进程状态取值3、调度等级取值4、结果参数解读5、 adb shell ps [options]简单使用5.1、 adb shell ps5.2、adb shell ps -p -P 显示进程调度等级等5.3、adb shell ps -c -t 显示耗用的时间信息 二、adb shell top 查看进程内存使用情况1、基本语法2、结果参数解读 三、adb shell dumpsys1、adb shell dumpsys meminfo 包名/PID 查询内存情况 引言 前面有一篇文章Android 进阶——调试调优利器 ADB常用指令大全总结了在调试中经常使用到的adb 普通指令,实际上在开发中要分析定位一些复杂问题还需要更多的指令,这一篇就好好总结下两个有用的进程相关的指令。 Tips : 所有adb shell 指令下都可以根据需求结合grep 或者findstr快速筛选出目标信息 一、adb shell ps 查看进程状态 ps (process status)在adb 中是查看android的进程状态指令。 1、基本语法 adb shell ps -P -p -t -x -c [pid] [name] [ | grep ] 参数说明-P显示调度策略,通常是bg或fg,当获取失败将会是un和er-p显示进程的优先级和nice等级-t显示进程下的线程列表-x显示进程耗费的用户时间和系统时间,格式(u:0, s:0),单位为:秒-c显示进程耗费的CPU时间(低于4.0版本可能不兼容)[pid]过滤指定的进程PID[name]过滤指定的进程NAME2、进程状态取值 NAME中进程状态的不同值如下: 状态值说明D不可中断的睡眠态R运行态S睡眠态T被跟踪或已停止Z僵尸态W进入内存交换(从内核2.6开始无效)X死掉的进程<高优先级N低优先级L有些页被锁进内存s包含子进程l多线程,克隆线程+位于后台的进程组3、调度等级取值 进程调度等级(优先级)有: 进程调度状态说明foreground process前台background process后台visible process可视化进程Services process服务进程empty process空进程4、结果参数解读 字段说明USER进程当前所属的用户PID进程IDPPID父进程IDVSIZE进程的虚拟内存大小,以KB为单位RSS进程实际占用的内存大小,以KB为单位WCHAN进程正在睡眠的内核函数名称,该函数名称是从/root、system.map文件中读取的,0代表进程处于运行态;否则代表内核地址(休眠态)PC计算机中提供要从“存储器”中取出的下一个指令地址的寄存器NAME进程状态和名称等,如 NAME下的S代表进程状态。PRIO进程优先级NICENice值RTPRI实时进程优先级SCHED调度策略PCY调度等级(进程类型)CPU占用CPU时间 ,显示进程耗费的用户时间和系统时间,格式:(u:0, s:0),单位:秒(s),比如u:130, s:125、 adb shell ps [options]简单使用 5.1、 adb shell ps 5.2、adb shell ps -p -P 显示进程调度等级等 5.3、adb shell ps -c -t 显示耗用的时间信息 二、adb shell top 查看进程内存使用情况 top命令提供了实时的对系统处理器的状态监视,将显示系统中CPU最“敏感”的任务列表,可以根据CPU使用、内存使用和执行时间对任务进行排序。 1、基本语法 adb shell top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ] 参数说明-m max_procs最多显示max_procs个进程-n num刷新num次数-d num刷新间隔时间num秒(默认5秒)-s col按col(cpu,vss,rss,thr)排序-tShow threads instead of processes. 显示线程信息而不是进程2、结果参数解读 参数说明User处于用户态的运行时间,不包含优先值为负进程Nice优先值为负的进程所占用的CPU时间Sys处于核心态的运行时间Idle除IO等待时间以外的其它等待时间IOWIO等待时间IRQ硬中断时间SIRQ软中断时间PID进程idPR优先级CPU%当前瞬时CPU占用率S进程状态,其中D=不可中断的睡眠状态, R=运行, S=睡眠, T=跟踪/停止, Z=僵尸进程#THR程序当前所用的线程数VSSVirtual Set Size 虚拟耗用内存(包含共享库占用的内存)RSSResident Set Size 实际使用物理内存(包含共享库占用的内存)PCY调度等级(进程类型)UID进程所有者的用户idName进程状态和名称,如 NAME下的S代表进程状态。 源码实现 xx\system\core\toolbox\top.c 三、adb shell dumpsys 指令说明adb shell dumpsys meminfo 包名查看指定包名应用内存使用情况adb shell dumpsys cpuinfo监控cpu运行情况adb shell dumpsys battery监控耗电变化,查看电池状态adb shell am force-stop 包名强制杀死某个进程,强制停止APP进程,不会清除APP进程在系统中产生的数据adb shell dumpsys package 包名dumps 所有包的堆栈信息adb shell dumpsys cpuinfo 包名查看指定包名的CPU使用情况adb shell dumpsys gfxinfo查看显示帧率adb shell dumpsys display查看显示参数adb shell dumpsys location查看位置信息1、adb shell dumpsys meminfo 包名/PID 查询内存情况 虚拟内存:进程空间内的虚拟内存地址,理论上32位cpu一个进程有4GB的虚拟内存可以使用。物理内存:就是真正写的到内存条上的,真实地址对进程不可见,由操作系统把虚拟内存地址映射到物理内存地址。Size:指的就是分配了多少虚拟内存Rss、Pss指的是实际物理内存使用的大小,由于这个内存段是纯new出来的,没有共享库,所以这两个值是一样的。由于只给4MB的数组赋值,操作系统只给分配了4MB的真实物理内存。Objects是统计App内部组件对象个数,其中Views、ViewRootImpl以及Activities个数,在Activity onDestroy后应该都会回收清零,如果onDestroy调用后这几个对象个数没有清零,就可能发生了内存泄漏。android程序内存被分为2部分:native和dalvik,dalvik就是java堆,普通java对象是在java堆分配,而bitmap是直接在native上分配,对于内存的限制是 native+dalvik 不能超过最大限制。 名词说明补充Uptime表示启动到现在的时长,不包含休眠的时间,单位毫秒(ms)Realtime表示启动到现在的时长,包含休眠的时间,单位毫秒(ms)Native Heap指c 中malloc出来的堆空间扩展:c++申请的内存为native process,java申请的内存:java processDalvik Heap指java中new出来的java堆空间只是占用的虚拟内存的空间Pss Total指占用了真实的物理内存的空间private dirty指私有驻留内存扩展:进程内存空间是虚拟内存,区分于物理内存,进程无法直接操作物理内存RAM。必要时,操作系统对其进行映射,使进程能应用到物理内存Heap Size指占用总内存(Heap 堆)Heap Alloc指在虚拟地址中分配了这么多空间Heap Free空闲内存 因为Android系统对dalvik的vm heapsize作了硬性限制,当java进程申请的java空间超过阈值时,就会抛出OOM异常(这个阈值可以是48M、24M、16M等,视机型而定)查看单个应用最大内存限制,输入命令:getprop|grep heapgrowthlimit 以上是关于Android 进阶——性能优化之借助adb shell ps /top 指令详细分析进程的主要内容,如果未能解决你的问题,请参考以下文章 phpstrom 快捷键 JavaScript_资料 您可能还会对下面的文章感兴趣: 相关文章 浏览器打不开网址提示“ERR_CONNECTION_TIMED_OUT”错误代码的解决方法 如何安装ocx控件 VMware的虚拟机为啥ip地址老是自动变化 vbyone和EDP区别 linux/debian到底怎么重启和关机 苹果平板键盘被弄到上方去了,如何调回正常? 机器学习常用距离度量 如何查看kindle型号