一、概述
1.1 内存指标概念
Item全称含义等价
USSUnique Set Size物理内存进程独占的内存
PSSProportional Set Size物理内存PSS= USS+ 按比例包含共享库
RSSResident Set Size物理内存RSS= USS+ 包含共享库
VSSVirtual 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部分:
序列划分类型排序解释
1processPSS以进程的PSS从大到小依次排序显示,每行显示一个进程;
2OOM adjPSSNative/System/Persistent/Foreground/Visible/Perceptible/A Services/Home/B Services/Cached,分别显示每类的进程情况
3categoryPSS以Dalvik/Native/.art mmap/.dex map等划分的各类进程的总PSS情况
4total-总内存、剩余内存、可用内存、其他内存
命令内容:
Total PSS by process://以process来划分
167128kB: com.android.systemui (pid4395)
124527kB: system (pid1192)
44213kB: com.android.settings (pid29256/ activities)
41822kB: surfaceflinger (pid391)
...
Total PSS by OOM adjustment://以oom来划分,会详细列举所有的类别的进程,此处省略.
183683kB: Native42024kB: surfaceflinger (pid388)
16740kB: mediaserver (pid471)
16040kB: zygote (pid494)
...124527kB: System
344259kB: Persistent
69719kB: Foreground
49026kB: Visible
34005kB: Perceptible
7880kB: A Services
58689kB: Home
98352kB: B Services
94888kB: Cached
Total PSS by category:// 以category划分
309449kB: Dalvik
230330kB: Native
45344kB: EGL mtrack
117797kB: .so mmap
54389kB: .art mmap
44886kB: .dex mmap
32428kB: Dalvik Other
31083kB: .oat mmap
29456kB: Stack
21782kB: Gfx dev
21733kB: Unknown
12695kB: .apk mmap
9367kB: Other mmap
2169kB: .ttf mmap
2062kB: Other dev
38kB: .jar mmap
12kB: Ashmem
8kB: Cursor
0kB: GL mtrack
0kB: Other mtrack//整体情况Total RAM:2857032kB (status moderate)
Free RAM:1439488kB (94888cached pss +344620cached kernel +999980free)
Used RAM:1280552kB (970140used pss +310412kernel)
Lost RAM:136992kB
ZRAM:4kB physical usedfor0kBinswap (524284kB total swap)
Tuning:256(large512), oom525000kB, restore limit175000kB (high-end-gfx)
另外,可只输出某个pid或package的进程信息:
dumpsys meminfo // 输出指定pid的某一进程dumpsys meminfo --package// 输出指定包名的进程,可能包含多个进程
2. procrank
功能: 获取所有进程的内存使用的排行榜,排行是以Pss的大小而排序。procrank命令比dumpsys meminfo命令,能输出更详细的VSS/RSS/PSS/USS内存指标。
最后一行输出下面6个指标:
totalfreebufferscachedshmemslab
执行结果:
root@Phone:/# procrankPID Vss Rss Pss Uss cmdline43952270020K202312K136099K121964K com.android.systemui11922280404K147048K89883K84144K system_server292562145676K97880K44328K40676K com.android.settings5011458332K61876K23609K9736K zygote42392105784K68056K21665K19592K com.android.phone479164392K24068K17970K15364K /system/bin/mediaserver391200892K27272K15930K11664K /system/bin/surfaceflinger...RAM:2857032K total,998088K free,78060K buffers,459780K cached,312K shmem,92392K slab
3. cat /proc/meminfo
功能:能否查看更加详细的内存信息
指令: cat /proc/meminfo
对于cache和buffer也是系统可以使用的内存。所以系统总的可用内存为 MemFree+Buffers+Cached
4.free
主功能:查看可用内存,缺省单位KB。该命令比较简单、轻量,专注于查看剩余内存情况。数据来源于/proc/meminfo。
5. showmap
主功能:用于查看虚拟地址区域的内存情况
用法:showmap-a[pid]
6. vmstat
主功能:不仅可以查看内存情况,还可以查看进程运行队列、系统切换、CPU时间占比等情况,另外该指令还是周期性地动态输出。
小结
dumpsys meminfo适用场景: 查看进程的oom adj,或者dalvik/native等区域内存情况,或者某个进程或apk的内存情况,功能非常强大;
procrank适用场景: 查看进程的VSS/RSS/PSS/USS各个内存指标;
cat /proc/meminfo适用场景: 查看系统的详尽内存信息,包含内核情况;
free适用场景: 只查看系统的可用内存;
showmap适用场景: 查看进程的虚拟地址空间的内存分配情况;
vmstat适用场景: 周期性地打印出进程运行队列、系统切换、CPU时间占比等情况;