Android中ps命令各字段的含义
通过ps命令查看进程的状态,看到如下输出:
USER PID PPID VSIZE RSS WCHAN PC S NAME
u0_a91 3140 356 2220664 85240 SyS_epoll_ 7f97b29798 S com.qiku.cardmanager
各字段的意义:
1 . USER:进程uid
2 . PID:进程pid
3 . PPID:父进程pid。所有app进程的父进程都是zygote, 所以zygote进程pid肯定是356:
root 356 1 2144280 65116 poll_sched 7f97b296d8 S zygote64
zygote的ppid为1,说明zygote父进程是init进程:
root 1 0 12852 1768 SyS_epoll_ 00004ae004 S /init
4 . VSIZE : 进程虚拟地址空间的大小。man ps中对VSIZE的解释:
virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change.
5.RSS:进程所占的物理内存大小。man ps中对RSS的解释:
resident set size, the non-swapped physical memory that a task has used (in kiloBytes).
6.PC:program counter,程序计数器。
7.Name:进程名
8.S 进程状态,常见的状态如下:
R 正在运行或在运行队列上等待调度
S 正在睡眠,该睡眠可被中断,如可以被信号唤醒
D 正在睡眠,该睡眠不可被中断,不接收信号
Z zombie僵尸进程。进程死后没有被其父进程回收
9 . WCHAN :当前线程在哪个内核函数上睡眠。man ps 对该字段的解释如下:
name of the kernel function in which the process is sleeping, a “-” if the process is running, or a “*” if the process is multi-threaded and ps is not displaying threads.
SyS_epoll_ 说明进程的主线程正在消息队列上等待,比如我们分析Android ANR问题时,经常遇到如下日志,说明主线程正在内核的epoll上睡眠,也就是说主线程正在消息循环上等待,因为消息循环就是通过epoll实现的。
在另一篇文章中消息介绍Android消息循环的实现。