1.1.1. 内存分析
adb shell procrank
PID Vss Rss Pss Uss Swap PSwap USwap ZSwap cmdline
390 576640K 394848K 389551K 388652K 3220K 3220K 3220K 10K /vendor/bin/hw/android.hardware.camera.provider@2.4-service
1687 1303876K 212472K 150646K 143456K 35320K 34092K 34028K 110K com.zuoyebang.iot.desk.zdservice
938 1651112K 156408K 80844K 66116K 5684K 4513K 4452K 14K system_server
1706 1161608K 136428K 73162K 64596K 4332K 3089K 3024K 10K com.zuoyebang.iot.desk.zdlauncher
284 72864K 59508K 57161K 57116K 152K 152K 152K 0K /system/bin/logd
1931 1111328K 77328K 20005K 6008K 22140K 4508K 2344K 14K com.android.permissioncontroller
1621 1082388K 68024K 12835K 7628K 1948K 664K 596K 2K com.android.providers.media.module
1422 1084220K 58516K 10719K 7188K 1912K 624K 556K 2K com.android.phone
------ ------ ------ ------ ------ ------ ------
931340K 829860K 381384K 189941K 165492K 615K TOTAL
ZRAM: 640K physical used for 197632K in swap (1606252K total swap)
RAM: 1784732K total, 55860K free, 496K buffers, 656736K cached, 7172K shmem, 150912K slab
从以上打印可以看出,一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)是单个进程全部可访问的地址空间 RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)是单个进程实际占用的内存大小,对于单个共享库, 尽管无论多少个进程使用,实际该共享库只会被装入内存一次。 PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存) USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)USS 是一个非常非常有用的数字, 因为它揭示了运行一个特定进程的真实的内存增量大小。如果进程被终止, USS 就是实际被返还给系统的内存大小。 USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。怀疑某个程序有内存泄露可以查看这个值是否一直有增加
1.1.2. adb shell top
Tasks: 353 total, 2 running, 349 sleeping, 0 stopped, 2 zombie
Mem: 1784732K total, 1741028K used, 44752896 free, 507904 buffers
Swap: 1606252K total, 197632K used, 1408620K free, 649028K cached
800%cpu 111%user 32%nice 43%sys 606%idle 0%iow 5%irq 3%sirq 0%host
PID USER PR NI VIRT RES SHR S[%CPU] %MEM TIME+ ARGS
1687 system 20 0 1.2G 69M 69M S 74.3 3.9 3008:18.4 com.zuoyebang.+
390 cameraserver 20 0 564M 334M 7.6M S 58.0 19.1 1686:41.9 android.hardwa+
284 logd 30 10 71M 58M 2.4M S 37.3 3.3 766:20.76 logd
489 system 20 0 7.7M 2.4M 2.2M R 8.0 0.1 273:35.69 ylogkat -v uid
366 system 20 0 102M 6.1M 2.3M S 7.6 0.3 276:20.18 ylog
581 cameraserver 20 0 49M 10M 8.0M S 3.6 0.5 122:56.36 cameraserver
491 root 20 0 8.8M 2.7M 2.6M S 2.6 0.1 79:06.43 dmesg -Tw
402 root 20 0 14M 3.2M 2.8M S 2.6 0.1 106:46.04 vendor.unisoc.+
220 root RT 0 0 0 0 S 2.0 0.0 85:37.42 [sugov:0]
19721 root 20 0 9.3M 3.8M 3.0M R 1.6 0.2 0:00.26 top
2173 root 20 0 0 0 0 S 1.0 0.0 29:58.34 [isp_ctx1_offl+
2172 root 20 0 0 0 0 S 1.0 0.0 19:15.22 [isp_ctx0_offl+
221 root 20 0 0 0 0 S 0.6 0.0 25:11.22 [sugov_perf:0]
2110 root 20 0 0 0 0 S 0.3 0.0 8:11.64 [cam0_capture]
697 system 20 0 17M 2.9M 2.6M S 0.3 0.1 2:58.98 thermald
641 system 20 0 23M 3.3M 2.0M S 0.3 0.1 20:12.94 slogmodem
495 system 20 0 7.1M 2.1M 1.9M S 0.3 0.1 1:41.83 sh /system/bin+
480 system 20 0 12M 2.7M 2.4M S 0.3 0.1 10:50.05 ylogw w 15 11 +
40 root 20 0 0 0 0 S 0.3 0.0 0:00.45 [ksoftirqd/6]
20 root 20 0 0 0 0 S 0.3 0.0 0:44.92 [ksoft
cpu状态
400%cpu -- CPU总量
8%user -- 用户空间占用CPU的百分比。
0%nice -- 改变过优先级的进程占用CPU的百分比
41%sys -- 内核空间占用CPU的百分比
394%idle -- 空闲CPU百分比
0%iow -- IO等待占用CPU的百分比
0%irq -- 硬中断(Hardware IRQ)占用CPU的百分比
0%sirq -- 软中断(Software Interrupts)占用CPU的百分比
0%host --
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量(virtual memory usage),单位kb。VIRT=SWAP+RES
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量
RES — resident memory usage 常驻内存,单位kb。RES=CODE+DATA
1、进程当前使用的内存大小,但不包括swap out
2、包含其他进程的共享
3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小
SHR — 共享内存(shared memory),单位kb
1、除了自身进程的共享内存,也包括其他进程的共享内存
2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
3、计算某个进程所占的物理内存大小公式:RES – SHR
4、swap out后,它将会降下来
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
ARGS — 进程名称(命令名/命令行)
实存(RES) 与 虚存(VIRT)分析
VIRT:
- 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等;
- 假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长10MB,而不是实际的1MB使用量。
- VIRT = SWAP + RES
RES:
- 进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间,但不包括swap ou量;
- 包含其他进程的共享;
- 如果申请10MB的内存,实际使用1MB,它只增长1MB;
- 关于库占用内存的情况,它只统计加载的库文件所占内存大小。
- RES = CODE + DATA
SHR:
- 除了自身进程的共享内存,也包括其他进程的共享内存;
- 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小;
- 计算某个进程所占的物理内存大小公式:RES – SHR;
- swap out后,它将会降下来。
具体信息可以查看源代码中: xx\system\core\toolbox\top.c