adb shell top

top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序.

top 用法

>adb shell top -h
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [-t ] [ -h ]
    -m num  Maximum number of processes to display. 最多显示多少个进程
    -n num  Updates to show before exiting.  刷新次数 
    -d num  Seconds to wait between updates. 刷新间隔时间(默认5秒)
    -s col  Column to sort by (cpu,vss,rss,thr). 按哪列排序 
    -t      Show threads instead of processes. 显示线程信息而不是进程
    -h      Display this help screen.  显示帮助文档

adb shell top

> adb shell top

User 13%, System 5%, IOW 0%, IRQ 0%
User 85 + Nice 0 + Sys 37 + Idle 509 + IOW 0 + IRQ 0 + SIRQ 0 = 631

  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
22205  0  13% S    56 423416K  88160K  fg u0_a92   com.tmall.wireless
24310  1   2% R     1   1232K    536K     root     top
22600  0   1% S    46 341712K  40872K  fg u0_a90   com.wandoujia.phoenix2.usbproxy
31125  1   1% S    31 319976K  33284K  fg u0_a74   com.android.Chinpower
 1533  0   1% S    32  67320K  20552K  fg system   /system/bin/surfaceflinger
 1852  0   1% S   112 445876K  80304K  fg system   system_server
    ...
   10  0   0% S     1      0K      0K     root     watchdog/0
   16  1   0% S     1      0K      0K     root     khelper
   22  1   0% S     1      0K      0K     root     suspend_sys_syn
   23  1   0% S     1      0K      0K     root     suspend

第一组数据的含义:

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   调度策略优先级,SP_BACKGROUND/SP_FOREGROUND
UID   进程所有者的用户id
Name  进程的名称

具体信息可以查看源代码中: xx\system\core\toolbox\top.c



从以上打印可以看出,一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS 



 VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)是单个进程全部可访问的地址空间 



RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)是单个进程实际占用的内存大小,对于单个共享库, 尽管无论多少个进程使用,实际该共享库只会被装入内存一次。 



PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存) 



USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)USS 是一个非常非常有用的数字, 因为它揭示了运行一个特定进程的真实的内存增量大小。如果进程被终止, USS 就是实际被返还给系统的内存大小。 


USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。怀疑某个程序有内存泄露可以查看这个值是否一直有增加 


Android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制。Android程序内存一般限制在16M,当然也有24M的。 
 从上信息对于分析内存泄露,内存溢出都有极大的作用,从以上信息可以看到该应用程序占用的native和dalvik,当TOTAL 16407 11792 12860 22275 18459 2003超过内存最大限制时会出现OOM错误。 


dumpsys [options]
               meminfo 显示内存信息
               cpuinfo 显示CPU信息
               account 显示accounts信息
               activity 显示所有的activities的信息
               window 显示键盘,窗口和它们的关系
               wifi 显示wifi信息

实例:



 使用adb查看app占用内存情况


1.adb shell


2.echo 3>/proc/sys/vm/drop_caches    清除一下系统cache


3..top -d 1 | grep com.guyue.demo   每一秒打印一次内存使用情况