内存管理-31-系统内存统计-5-procrank与procmem
一、VSS/RSS/PSS/USS的区别
1. VSS
Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
VSS表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已经申请但尚未使用的内存空间。在实际中很少用这种方式来表示进程占用内存的情况,用它来表示单个进程的内存使用情况是不准确的。
此大小还包括可能不驻留在RAM中的内存,如已分配但未写入的malloc。 VSS对于确定进程的实际内存使用非常少用。
2. RSS:
Resident Set Size 实际使用物理内存(包含共享库占用的内存)
表示一个进程在RAM中实际使用的空间地址大小,包括了全部共享库占用的内存,这种表示进程占用内存的情况也是不准确的。
RSS可能会产生误导,因为它报告进程使用的所有共享库的总数,即使共享库只加载到内存中一次,无论有多少进程使用它。 RSS也不是单个进程的内存使用的准确表示。
3. PSS:
Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
表示一个进程在RAM中实际使用的空间地址大小,它按比例包含了共享库占用的内存。假如有3个进程使用同一个共享库,那么每个进程的PSS就包括了1/3大小的共享库内存。这种方式表示进程的内存使用情况较准确,但当只有一个进程使用共享库时,其情况和RSS一模一样。
当一个进程被销毁时,其占用的那部分PSS又会被按比例地分配给其余使用这些库的进程。
4. USS:
Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
表示一个进程本身占用的内存空间大小,不包含其它任何成分,这是表示进程内存大小的最好方式!
USS是一个非常有用的数字,因为它表示运行特定进程的真正内存增量成本。当进程被终止时,USS是实际返回到系统的总内存。 USS是判断进程中的内存泄漏时最值得注意的数字。
总结:
USS 大小代表只属于本进程正在使用的内存大小,进程被杀死后会被完整回收; VSS/RSS 包含了共享库使用的内存,对查看单一进程内存状态没有参考价值; PSS 是按照比例将共享内存分割后,某单一进程对共享内存区的占用情况。
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
二、procrank命令
1. 简介
是一个命令行工具,用于显示Android设备上当前运行的进程的内存使用情况。它可以按照内存使用量对进程进行排序,并显示每个进程的详细信息,如进程名、用户ID、优先级等。
procrank 命令支持多种参数和选项,用于控制输出格式和排序方式:
-v:按照 VSS(Virtual Set Size)排序。
-r:按照 RSS(Resident Set Size)排序。
-p:按照 PSS(Proportional Set Size)排序。
-u:按照 USS(Unique Set Size)排序。
-R:转换为递增(或递减)方式排序。
-w:只显示working set的统计计数。
-W:重置working set的统计计数。
-h:显示帮助信息。
使用场景:
通过 procrank 命令,开发者可以快速定位内存使用量较高的进程,进一步分析是否存在内存泄漏或其他问题。
2. 数据格式
# procrank PID Vss Rss Pss Uss Swap PSwap USwap ZSwap cmdline 1546 23119064K 434772K 246374K 221424K 26896K 25795K 25776K 8547K system_server 2195 18248184K 348776K 180992K 166788K 27548K 26431K 26412K 8758K com.android.systemui ... 1108 10797196K 3268K 65K 44K 648K 648K 648K 214K /system/bin/thermald ------ ------ ------ ------ ------ ------ ------ 1850510K 1456516K 699812K 624553K 620960K 206964K TOTAL ZRAM: 208520K physical used for 629248K in swap (4194300K total swap) RAM: 10989740K total, 343872K free, 10312K buffers, 7536160K cached, 20688K shmem, 487084K slab
三、promem命令
1. 简介
procrank命令从宏观上给出了进程的内存总体情况,但如果需要详细分析某个进程的内存分配细节,这个时候就需要procmem出场了。
procmem使用说明:
# 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.
2. 命令数据格式
比如下面看surfaceflinger的数据格式
# procmem -p 632 Vss Rss Pss Uss ShCl ShDi PrCl PrDi Name ------- ------- ------- ------- ------- ------- ------- ------- 11080K 4876K 2272K 76K 840K 3960K 4K 72K /vendor/lib64/libllvm-glnext.so 2048K 1852K 1852K 1852K 0K 0K 1852K 0K [anon:libc_malloc] 768K 768K 768K 768K 0K 0K 512K 256K /dev/kgsl-3d0 168K 168K 168K 168K 0K 0K 168K 0K [anon:.bss] 2048K 120K 120K 120K 0K 0K 120K 0K [anon:libc_malloc] 132K 48K 48K 48K 0K 0K 44K 4K [stack] 1016K 12K 12K 12K 0K 0K 12K 0K /dev/binder 可以看出一个binder占1M-2page大小 816K 380K 11K 4K 0K 376K 4K 0K /system/lib64/libc++.so 140K 116K 11K 0K 4K 112K 0K 0K /system/lib64/libui.s 6292K 0K 0K 0K 0K 0K 0K 0K anon_inode:dmabuf ... 11460K 0K 0K 0K 0K 0K 0K 0K anon_inode:dmabuf 4K 0K 0K 0K 0K 0K 0K 0K ------- ------- ------- ------- ------- ------- ------- ------- 2357736K 25984K 16163K 13280K 1488K 11216K 12600K 692K TOTAL
从procmem输出的结果可以看到它给出了内存是如何分配的细节,但面对这茫茫多的输出数据,我们该如何从中寻找问题点呢?
内存异常问题往往伴随着内存泄露,而内存泄露的本质就是申请的内存区域得不到正常释放,表现在procmem的输出结果就是多条同名的记录出现。因此如果发现procmem输出的结果里某条记录出现次数过多,比如五六百次,那么我们应当小心对待了。
posted on 2021-11-30 20:07 Hello-World3 阅读(2211) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步