一、概述
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 内存剖析指令
常用的内存调优剖析指令:
- dumpsys meminfo
- procrank
- cat /proc/meminfo
- free
- showmap
- 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
小结
-
dumpsys meminfo
适用场景: 检查进程的oom adj,或许dalvik/native等区域内存状况,或许某个进程或apk的内存状况,功用非常强壮; -
procrank
适用场景: 检查进程的VSS/RSS/PSS/USS各个内存指标; -
cat /proc/meminfo
适用场景: 检查体系的翔实内存信息,包含内核状况; -
free
适用场景: 只检查体系的可用内存; -
showmap
适用场景: 检查进程的虚拟地址空间的内存分配状况; -
vmstat
适用场景: 周期性地打印出进程运转行列、体系切换、CPU时刻占比等状况;
gityuan.com/2016/01/02/…