Android内存监测之procrank procmem
Android系统中提供了两个命令行工具procrank、procmem用于查看系统中的内存使用情况。这两个工具对于我们分析内存相关问题非常有效。由于Android系统使用的是Linux内核,理论上这样的工具可以在Linux上运行。本质上通过proc内信息统计计算。
- procrank可以查看系统中所有进程的整体内存占用情况,并按照规则排序。
- procmem可以针对某个特定的进程分析其堆、栈、共享库等内存占用情况。
手机中的sh是经过精简过的,有些手机可能没有 procrank 命令,
需要下载procrank 和 procmem 可链接:android内存监测之procrank 或 android内存监测之procmem
procrank (only for Android)
从/proc/pid/maps中读取信息来进行统计。源码位于:/system/extras/procrank
需要自己编译源码的可参考github:https://github.com/ZaccurLi/procrank_procmem
信息介绍
内存耗用:VSS/RSS/PSS/USS
• VSS | - Virtual Set Size | 虚拟耗用内存(包含共享库占用的内存) 单个进程全部可访问的地址空间 |
• RSS | - Resident Set Size | 实际使用物理内存(包含共享库占用的内存) 单个进程实际占用的内存大小,对于单个共享库, 尽管无论多少个进程使用,实际该共享库只会被装入内存一次 |
• PSS | - Proportional Set Size | 实际使用的物理内存(比例分配共享库占用的内存) |
• USS | - Unique Set Size | 进程独自占用的物理内存(不包含共享库占用的内存) USS 揭示了运行一个特定进程的真实的内存增量大小。如果进程被终止, USS 就是实际被返还给系统的内存大小. |
USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。
怀疑某个程序有内存泄露可以查看这个值是否一直有增加。
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
procrank功能:
获取所有进程的内存使用的排行榜,默认是按照PSS降序排列即以Pss的大小而排序。
procrank命令比dumpsys meminfo命令,能输出更详细的VSS/RSS/PSS/USS内存指标。
通常可以配合脚本运行,实时监测内存变化:
#!/bin/bash while true; do adb shell procrank | grep "xxxxxx" #pause 0.1second sleep 0.1 |
运行该脚本: ./trackmem.sh
这个脚本的用途是每0.1秒钟让系统输出一次xxxxxx的内存使用状况
procrank -h显示帮助
# sudo ./procrank -h Usage: ./procrank [ -W ] [ -v | -r | -p | -u | -s | -h ] -v Sort by VSS. -r Sort by RSS. -p Sort by PSS. -u Sort by USS. -s Sort by swap. (Default sort order is PSS.) -R Reverse sort order (default is descending). -c Only show cached (storage backed) pages -C Only show non-cached (ram/swap backed) pages -k Only show pages collapsed by KSM -w Display statistics for working set only. -W Reset working set of all processes. -h Display this help screen. |
默认直接命令
BBH100:/ # procrank PID Vss Rss Pss Uss cmdline 2145 486328K 273728K 198544K 186440K system_server 2422 871360K 154844K 86987K 80256K com.google.android.inputmethod.latin …… 1190 10252K 1920K 539K 524K /vendor/bin/seemp_healthd ------ ------ ------ 1404868K 1168344K TOTAL
RAM: 5862740K total, 1615392K free, 160128K buffers, 2367748K cached, 1112K shmem, 241616K slab BBH100:/ # |
procmem
procrank 给出了系统整体的内存占用情况,针对每一个进程具体分析就要使用procmem工具了。
同样运行procmem需要root权限。
procmem 给出了procrank中VSS、RSS、PSS、USS的每一部分组成,包括进程可执行程序本身、共享库、堆、栈的内存占用。这里的信息应该是从/proc/pid/maps文件中获取的.
BBH100:/ # procmem Usage: procmem [ -w | -W ] [ -p | -m ] [ -h ] pid -w Displays statistics for the working set only. -W Resets the working set of the process. -p Sort by PSS. -m Sort by mapping order (as read from /proc). -h Hide maps with no RSS. 1|BBH100:/ # procmem 1190 Vss Rss Pss Uss ShCl ShDi PrCl PrDi Name ------- ------- ------- ------- ------- ------- ------- ------- 4K 4K 4K 4K 0K 0K 4K 0K /vendor/bin/seemp_healthd 4K 4K 4K 4K 0K 0K 4K 0K /vendor/bin/seemp_healthd 4K 4K 4K 4K 0K 0K 4K 0K /vendor/bin/seemp_healthd 4096K 104K 104K 104K 0K 0K 104K 0K [anon:libc_malloc] …… 432K 12K 12K 12K 0K 0K 12K 0K 4K 4K 4K 4K 0K 0K 4K 0K 28K 12K 12K 12K 0K 0K 12K 0K 132K 36K 36K 36K 0K 0K 32K 4K [stack] ------- ------- ------- ------- ------- ------- ------- ------- 10252K 1920K 539K 524K 20K 1376K 520K 4K TOTAL BBH100:/ # |