Android 进阶——性能优化之借助adb shell ps /top 指令详细分析进程
Posted CrazyMo_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 进阶——性能优化之借助adb shell ps /top 指令详细分析进程相关的知识,希望对你有一定的参考价值。
文章大纲
引言
前面有一篇文章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 | 进程优先级 |
NICE | Nice值 |
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)排序 |
-t | Show threads instead of processes. 显示线程信息而不是进程 |
2、结果参数解读
参数 | 说明 |
---|---|
User | 处于用户态的运行时间,不包含优先值为负进程 |
Nice | 优先值为负的进程所占用的CPU时间 |
Sys | 处于核心态的运行时间 |
Idle | 除IO等待时间以外的其它等待时间 |
IOW | IO等待时间 |
IRQ | 硬中断时间 |
SIRQ | 软中断时间 |
PID | 进程id |
PR | 优先级 |
CPU% | 当前瞬时CPU占用率 |
S | 进程状态,其中D=不可中断的睡眠状态, R=运行, S=睡眠, T=跟踪/停止, Z=僵尸进程 |
#THR | 程序当前所用的线程数 |
VSS | Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) |
RSS | Resident 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 指令详细分析进程的主要内容,如果未能解决你的问题,请参考以下文章
Android 进阶——性能优化之借助adb shell ps /top 指令详细分析进程
Android 进阶——性能优化之Bitmap位图内存管理及优化概述
Android 进阶——性能优化之Bitmap位图内存管理及优化概述
Android 进阶——性能优化之Bitmap位图内存管理及优化概述