1. 概述
1.1 内存指标
简称 | 全称 | 含义 | 备注 |
---|---|---|---|
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
- vmstat
2. 命令介绍
2.1 dumpsys meminfo
示例:
1 | root:/ $ dumpsys meminfo |
dumpsys meminfo
输出结果分为4部分:
- PSS by process: 以进程的PSS从大到小一次排序显示,每行显示一个进程
- PSS by OOM adjustment: 分别显示每类的进程情况
- PSS by category: 各类进程的总PSS请客
- Total: 总内存、剩余内存、已用内存、其他
也可输出单个pid或者package的进程信息:
1 | dumpsys meminfo 17995 // 输出进程17995的信息 |
2.2 procrank
procrank
命令可以获取所有进程的内存使用的排行榜,排行是按照Pss的大小排序,相比dumpsys meminfo
命令,能输出更详细的VSS/RSS/PSS/USS内存指标。由于所用手机被精简,不再上例子。
2.3 cat /proc/meminfo
示例:
1 | root:/ # cat proc/meminfo |
之前没弄明白 MemFree 和 MemAvailable 的区别,今天有空顺手查了查,总结如下:
- MemTotal: 内存总数,除去内核等使用的,剩下的可供系统支配的内存。
- MemFree: 空闲内存数,表示系统尚未使用的内存。MemUsed=MemTotal-MemFree就是已被用掉的内存
- MemAvailable: 应用程序可用内存数,系统中有些内存虽然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以MemFree不能代表全部可用的内存,这部分可回收的内存加上MemFree才是系统可用的内存,即:MemAvailable≈MemFree+Buffers+Cached,它是内核使用特定的算法计算出来的,是一个估计值。与MemFree的关键区别点在于,MemFree是说的系统层面,MemAvailable是说的应用程序层面。
- Buffers: 缓冲区内存数。
- Cache: 缓存区内存数。
2.4 free
示例:
1 | root:/ # free |
free
比较简单轻量,用于查看可用内存,缺省单位KB,专注于查看剩余内存情况,数据来源于/proc/meminfo。
- OS Mem:total = used + free;
- buffers/cache:used = used(Mem) - buffers(Mem);
- buffers/cache:free = free(Mem) + buffers(Mem);
- buffers/cache:total = buffers/cache used + buffers/cache free = OS Mem total
2.5 vmstat
vmstat
命令不仅可以查看内存情况,还可以查看进程运行队列、系统切换、CPU时间占比等情况,而且是周期性的动态输出。
示例:
1 | root:/ # vmstat |
参数列总共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
适用场景: 只查看系统的可用内存;vmstat
适用场景: 周期性地打印出进程运行队列、系统切换、CPU时间占比等情况;
本文参考了Gityuan博客,在此表示感谢。