一、概述

1.1 内存指标概念

Item 全称 含义 等价
USS Unique Set Size 物理内存 进程独占的内存
PSS Proportional Set Size 物理内存 PSS = USS + 按比例包含同享库
RSS Resident Set Size 物理内存 RSS = USS + 包含同享库
VSS Virtual Set Size 虚拟内存 VSS = RSS + 未分配实践物理内存

故内存的巨细联系:VSS >= RSS >= PSS >= USS

1.2 内存剖析指令

常用的内存调优剖析指令:

  1. dumpsys meminfo
  2. procrank
  3. cat /proc/meminfo
  4. free
  5. showmap
  6. vmstat

二 指令说明

1. dumpsys meminfo

dumpsys meminfo指令的输出成果分以下4部分:

序列 区分类型 排序 解释
1 process PSS 以进程的PSS从大到小顺次排序显现,每行显现一个进程;
2 OOM adj PSS Native/System/Persistent/Foreground/Visible/Perceptible/A Services/Home/B Services/Cached,别离显现每类的进程状况
3 category PSS 以Dalvik/Native/.art mmap/.dex map等区分的各类进程的总PSS状况
4 total 总内存、剩下内存、可用内存、其他内存

指令内容:

Total PSS by process: //以process来区分
   167128 kB: com.android.systemui (pid 4395)
   124527 kB: system (pid 1192)
    44213 kB: com.android.settings (pid 29256 / activities)
    41822 kB: surfaceflinger (pid 391)
    ...
Total PSS by OOM adjustment: //以oom来区分,会详细罗列所有的类别的进程,此处省掉.
   183683 kB: Native
        42024 kB: surfaceflinger (pid 388)
        16740 kB: mediaserver (pid 471)
        16040 kB: zygote (pid 494)
        ...
   124527 kB: System
   344259 kB: Persistent
    69719 kB: Foreground
    49026 kB: Visible
    34005 kB: Perceptible
     7880 kB: A Services
    58689 kB: Home
    98352 kB: B Services
    94888 kB: Cached
Total PSS by category:  // 以category区分
   309449 kB: Dalvik
   230330 kB: Native
   145344 kB: EGL mtrack
   117797 kB: .so mmap
    54389 kB: .art mmap
    44886 kB: .dex mmap
    32428 kB: Dalvik Other
    31083 kB: .oat mmap
    29456 kB: Stack
    21782 kB: Gfx dev
    21733 kB: Unknown
    12695 kB: .apk mmap
     9367 kB: Other mmap
     2169 kB: .ttf mmap
     2062 kB: Other dev
       38 kB: .jar mmap
       12 kB: Ashmem
        8 kB: Cursor
        0 kB: GL mtrack
        0 kB: Other mtrack
//整体状况
Total RAM: 2857032 kB (status moderate)
 Free RAM: 1439488 kB (94888 cached pss + 344620 cached kernel + 999980 free)
 Used RAM: 1280552 kB (970140 used pss + 310412 kernel)
 Lost RAM: 136992 kB
     ZRAM: 4 kB physical used for 0 kB in swap (524284 kB total swap)
   Tuning: 256 (large 512), oom 525000 kB, restore limit 175000 kB (high-end-gfx)

别的,可只输出某个pid或package的进程信息:

dumpsys meminfo <pid> // 输出指定pid的某一进程
dumpsys meminfo --package <packagename> // 输出指定包名的进程,或许包含多个进程

2. procrank

功用: 获取所有进程的内存运用的排行榜,排行是以Pss的巨细而排序。procrank指令比dumpsys meminfo指令,能输出更详细的VSS/RSS/PSS/USS内存指标。

最后一行输出下面6个指标:

| total | free | buffers | cached | shmem | slab |

执行成果:

root@Phone:/# procrank
  PID       Vss      Rss      Pss      Uss  cmdline
 4395  2270020K  202312K  136099K  121964K  com.android.systemui
 1192  2280404K  147048K   89883K   84144K  system_server
29256  2145676K   97880K   44328K   40676K  com.android.settings
  501  1458332K   61876K   23609K    9736K  zygote
 4239  2105784K   68056K   21665K   19592K  com.android.phone
  479   164392K   24068K   17970K   15364K  /system/bin/mediaserver
  391   200892K   27272K   15930K   11664K  /system/bin/surfaceflinger
...
RAM: 2857032K total, 998088K free, 78060K buffers, 459780K cached, 312K shmem, 92392K slab

3. cat /proc/meminfo

功用:能否检查愈加详细的内存信息

指令: cat /proc/meminfo

输出成果如下(成果内存值不带小数点,此处添加小数点的意图是为了便于比对巨细):

root@phone:/ # cat /proc/meminfo
MemTotal:        2857.032 kB  //RAM可用的总巨细 (即物理总内存减去体系预留和内核二进制代码巨细)
MemFree:         1020.708 kB  //RAM未运用的巨细
Buffers:           75.104 kB  //用于文件缓冲
Cached:           448.244 kB  //用于高速缓存
SwapCached:             0 kB  //用于swap缓存
Active:           832.900 kB  //活泼运用状态,记载最近运用过的内存,通常不收回用于其它意图
Inactive:         391.128 kB  //非活泼运用状态,记载最近并没有运用过的内存,能够被收回用于其他意图
Active(anon):     700.744 kB  //Active = Active(anon) + Active(file)
Inactive(anon):       228 kB  //Inactive = Inactive(anon) + Inactive(file)
Active(file):     132.156 kB
Inactive(file):   390.900 kB
Unevictable:            0 kB
Mlocked:                0 kB
SwapTotal:        524.284 kB  //swap总巨细
SwapFree:         524.284 kB  //swap可用巨细
Dirty:                  0 kB  //等候往磁盘回写的巨细
Writeback:              0 kB  //正在往磁盘回写的巨细
AnonPages:        700.700 kB  //匿名页,用户空间的页表,没有对应的文件
Mapped:           187.096 kB  //文件经过mmap分配的内存,用于map设备、文件或许库
Shmem:               .312 kB
Slab:              91.276 kB  //kernel数据结构的缓存巨细,Slab=SReclaimable+SUnreclaim
SReclaimable:      32.484 kB  //可收回的slab的巨细
SUnreclaim:        58.792 kB  //不可收回slab的巨细
KernelStack:       25.024 kB
PageTables:        23.752 kB  //以最低的页表级
NFS_Unstable:           0 kB  //不稳定页表的巨细
Bounce:                 0 kB
WritebackTmp:           0 kB
CommitLimit:     1952.800 kB
Committed_AS:   82204.348 kB   //评估完成的工作量,代表最糟糕case下的值,该值也包含swap内存
VmallocTotal:  251658.176 kB  //总分配的虚拟地址空间
VmallocUsed:      166.648 kB  //已运用的虚拟地址空间
VmallocChunk:  251398.700 kB  //虚拟地址空间可用的最大连续内存块

关于cache和buffer也是体系能够运用的内存。所以体系总的可用内存为 MemFree+Buffers+Cached

4.free

主功用:检查可用内存,缺省单位KB。该指令比较简单、轻量,专心于检查剩下内存状况。数据来源于/proc/meminfo。

输出成果:

root@phone:/proc/sys/vm # free
             total         used         free       shared      buffers
Mem:       2857032      1836040      1020992            0        75104
-/+ buffers:            1760936      1096096
Swap:       524284            0       524284
  • 关于Mem行,存在的公式联系: total = used + free;
  • 关于-/+ buffers行: 1760936 = 1836040 – 75104(buffers); 1096096 = 1020992 + 75104(buffers);

5. showmap

主功用:用于检查虚拟地址区域的内存状况

用法:  showmap -a [pid]

该指令的输出每一行代表一个虚拟地址区域(vm area)

root@phone:/ # showmap -a 10901
   start    end      virtual                   shared   shared  private  private
    addr     addr     size      RSS      PSS    clean    dirty    clean    dirty object
-------- -------- -------- -------- -------- -------- -------- -------- -------- ------------------------------
f3b87000 f3d85000     2040        4        4        0        0        4        0 /dev/binder
  • start addr和end addr:别离代表进程空间的起止虚拟地址;
  • virtual size/ RSS /PSS这些前面介绍过;
  • shared clean:代表多个进程的虚拟地址可指向这块物理空间,即有多少个进程同享这个库;
  • shared: 同享数据
  • private: 该进程私有数据
  • clean: 干净数据,是指该内存数据与disk数据共同,当内存紧张时,可直接开释内存,不需要回写到disk
  • dirty: 脏数据,与disk数据不共同,需要先回写到disk,才干被开释。

功用与cat /proc/[pid]/maps根本共同。

6. vmstat

主功用:不仅能够检查内存状况,还能够检查进程运转行列、体系切换、CPU时刻占比等状况,别的该指令仍是周期性地动态输出。

用法:

Usage: vmstat [ -n iterations ] [ -d delay ] [ -r header_repeat ]
    -n iterations     数据循环输出的次数
    -d delay          两次数据间的推迟时长(单位:S)
    -r header_repeat  循环多少次,再输出一次头信息行

输入成果:

root@phone:/ # vmstat
procs  memory                       system          cpu
 r  b   free  mapped   anon   slab    in   cs  flt  us ni sy id wa ir
 2  0  663436 232836 915192 113960   196  274    0   8  0  2 99  0  0
 0  0  663444 232836 915108 113960   180  260    0   7  0  3 99  0  0
 0  0  663476 232836 915216 113960   154  224    0   2  0  5 99  0  0
 1  0  663132 232836 915304 113960   179  259    0  11  0  3 99  0  0
 2  0  663124 232836 915096 113960   110  175    0   4  0  3 99  0  0

参数列一共15个参数,分为4大类:

  • procs(进程)
    • r: Running行列中进程数量
    • b: IO wait的进程数量
  • memory(内存)
    • free: 可用内存巨细
    • mapped:mmap映射的内存巨细
    • anon: 匿名内存巨细
    • slab: slab的内存巨细
  • system(体系)
    • in: 每秒的中止次数(包含时钟中止)
    • cs: 每秒上下文切换的次数
  • cpu(处理器)
    • us: user time
    • ni: nice time
    • sy: system time
    • id: idle time
    • wa: iowait time
    • ir: interrupt time

小结

  1. dumpsys meminfo适用场景: 检查进程的oom adj,或许dalvik/native等区域内存状况,或许某个进程或apk的内存状况,功用非常强壮;
  2. procrank适用场景: 检查进程的VSS/RSS/PSS/USS各个内存指标;
  3. cat /proc/meminfo适用场景: 检查体系的翔实内存信息,包含内核状况;
  4. free适用场景: 只检查体系的可用内存;
  5. showmap适用场景: 检查进程的虚拟地址空间的内存分配状况;
  6. vmstat适用场景: 周期性地打印出进程运转行列、体系切换、CPU时刻占比等状况;

gityuan.com/2016/01/02/…