卓尔高考网

Android 进阶——性能优化之借助adb shell ps /top 指令详细分析进程

篇首语:本文由小编为大家整理,主要介绍了Android 进阶——性能优化之借助adb shell ps /top 指令详细分析进程相关的知识,希望对你有一定的参考价值。

文章大纲

  • 引言
  • 一、adb shell ps 查看进程状态
    • 1、基本语法
    • 2、进程状态取值
    • 3、调度等级取值
    • 4、结果参数解读
    • 5、 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 查看进程内存使用情况
    • 1、基本语法
    • 2、结果参数解读
  • 三、adb shell dumpsys
    • 1、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]过滤指定的进程NAME

2、进程状态取值

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进程ID
PPID父进程ID
VSIZE进程的虚拟内存大小,以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:12

5、 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进程id
PR优先级
CPU%当前瞬时CPU占用率
S进程状态,其中D=不可中断的睡眠状态, R=运行, S=睡眠, T=跟踪/停止, Z=僵尸进程
#THR程序当前所用的线程数
VSSVirtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSSResident Set Size 实际使用物理内存(包含共享库占用的内存)
PCY调度等级(进程类型)
UID进程所有者的用户id
Name进程状态和名称,如 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 process
Dalvik 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 指令详细分析进程的主要内容,如果未能解决你的问题,请参考以下文章

您可能还会对下面的文章感兴趣: