一、概述
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 | – | 总内存、剩余内存、可用内存、其他内存 |
命令内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
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的进程信息:
1 2 |
dumpsys meminfo // 输出指定pid的某一进程 dumpsys meminfo --package // 输出指定包名的进程,可能包含多个进程 |
2. procrank
功能: 获取所有进程的内存使用的排行榜,排行是以Pss
的大小而排序。procrank
命令比dumpsys meminfo
命令,能输出更详细的VSS/RSS/PSS/USS内存指标。
最后一行输出下面6个指标:
total | free | buffers | cached | shmem | slab |
执行结果:
1 2 3 4 5 6 7 8 9 10 11 |
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
功能:能否查看更加详细的内存信息
1 |
指令: cat /proc/meminfo |
输出结果如下(结果内存值不带小数点,此处添加小数点的目的是为了便于比对大小):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
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 //不稳定页表的大小 |