内存管理-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   Hello-World3  阅读(2211)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示