procrank命令简介
procrank是/system/xbin/下的一个命令,在整机开发的时候,使用该命令查看应用进程的内存情况很方便。但是这个命令正常在debug/eng模式编译的时候才有,如果你是做第三方应用开发,如果可以root的手机的话,通过往该手机中push该命令,应该也可以使用该命令。
C:\Users\hai.qin>adb shell
K700AN:/ # which procrank
/system/xbin/procrank
procrank命令输出
执行procrank命令可以看到如下输出:
$ adb shell procrank
PID Vss Rss Pss Uss Swap PSwap USwap ZSwap cmdline
19463 1876424K 176128K 49493K 35400K 8952K 4827K 4652K 1650K system_server
19595 1282664K 163112K 41045K 28216K 12428K 8236K 8060K 2816K com.android.systemui
25401 1258300K 121836K 28611K 18552K 27728K 23593K 23420K 8068K com.android.launcher3
21342 1254156K 132608K 25632K 15012K 34224K 30012K 29836K 10263K com.android.settings
8649 1214196K 120172K 21593K 14092K 16232K 12059K 11884K 4123K com.android.dialer
19766 1201056K 85156K 12436K 8404K 6500K 1997K 1800K 683K com.android.phone
19585 1170636K 100872K 10411K 5412K 13224K 8843K 8656K 3024K com.android.inputmethod.latin
7572 1198340K 103136K 9585K 1036K 11404K 7170K 6988K 2451K com.android.systemui:screenshot
......
上面输出列表是根据不同进程的内存占用情况,从大到小的顺序排列的。这里主要需要关注的是Vss、Rss、Pss、Uss这4个参数,来了解下它们的含义。
1、Vss
Vss与PS的VSIZE相同是单个进程全部可访问的地址空间
其大小包括可能还尚未在内存中驻留的部分。比如地址空间已经被 malloc 分配,但是还没有实际写入。
对于确定单个进程实际内存使用大小, VSS 用处不大。
2、Rss
RSS是单个进程实际占用的内存大小。
RSS易被误导的原因在于, 它包括了该进程所使用的所有共享库的全部内存大小。对于单个共享库, 尽管无论多少个进程使用,
实际该共享库只会被装入内存一次。
对于单个进程的内存使用大小, RSS 不是一个精确的描述。
3、Pss
PSS 不同于RSS,它只是按比例包含其所使用的共享库大小。
例如, 三个进程使用同一个占用 30 内存页的共享库。 对于三个进程中的任何一个,PSS 将只包括 10 个内存页。
PSS 是一个非常有用的数字,因为系统中全部进程以整体的方式被统计, 对于系统中的整体内存使用是一个很好的描述。
如果一个进程被终止, 其PSS 中所使用的共享库大小将会重新按比例分配给剩下的仍在运行并且仍在使用该共享库的进程。
此种计算方式有轻微的误差,因为当某个进程中止的时候,PSS没有精确的表示被返还给整个系统的内存大小。
4、Uss
USS 是单个进程的全部私有内存大小。亦即全部被该进程独占的内存大小。
USS 是一个非常非常有用的数字, 因为它揭示了运行一个特定进程的真实的内存增量大小。
如果进程被终止, USS 就是实际被返还给系统的内存大小。
USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。
小结
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS