一、概述
1.1 內(nèi)存指標(biāo)概念
Item | 全稱 | 含義 | 等價(jià) |
---|---|---|---|
USS | Unique Set Size | 物理內(nèi)存 | 進(jìn)程獨(dú)占的內(nèi)存 |
PSS | Proportional Set Size | 物理內(nèi)存 | PSS = USS + 按比例包含共享庫 |
RSS | Resident Set Size | 物理內(nèi)存 | RSS = USS + 包含共享庫 |
VSS | Virtual Set Size | 虛擬內(nèi)存 | VSS = RSS + 未分配實(shí)際物理內(nèi)存 |
故內(nèi)存的大小關(guān)系:VSS >= RSS >= PSS >= USS
1.2 內(nèi)存分析命令
常用的內(nèi)存調(diào)優(yōu)分析命令:
- dumpsys meminfo
- procrank
- cat /proc/meminfo
- free
- showmap
- vmstat
二 命令說明
1. dumpsys meminfo
dumpsys meminfo
命令的輸出結(jié)果分以下4部分:
序列 | 劃分類型 | 排序 | 解釋 |
---|---|---|---|
1 | process | PSS | 以進(jìn)程的PSS從大到小依次排序顯示蝉衣,每行顯示一個(gè)進(jìn)程舒憾; |
2 | OOM adj | PSS | Native/System/Persistent/Foreground/Visible/Perceptible/A Services/Home/B Services/Cached,分別顯示每類的進(jìn)程情況 |
3 | category | PSS | 以Dalvik/Native/.art mmap/.dex map等劃分的各類進(jìn)程的總PSS情況 |
4 | total | - | 總內(nèi)存居灯、剩余內(nèi)存祭务、可用內(nèi)存、其他內(nèi)存 |
命令內(nèi)容:
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來劃分怪嫌,會(huì)詳細(xì)列舉所有的類別的進(jìn)程义锥,此處省略.
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)
另外,可只輸出某個(gè)pid或package的進(jìn)程信息:
dumpsys meminfo <pid> // 輸出指定pid的某一進(jìn)程
dumpsys meminfo --package <packagename> // 輸出指定包名的進(jìn)程岩灭,可能包含多個(gè)進(jìn)程
2. procrank
功能: 獲取所有進(jìn)程的內(nèi)存使用的排行榜拌倍,排行是以Pss
的大小而排序。procrank
命令比dumpsys meminfo
命令噪径,能輸出更詳細(xì)的VSS/RSS/PSS/USS內(nèi)存指標(biāo)柱恤。
最后一行輸出下面6個(gè)指標(biāo):
| total | free | buffers | cached | shmem | slab |
執(zhí)行結(jié)果:
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
功能:能否查看更加詳細(xì)的內(nèi)存信息
指令: cat /proc/meminfo
輸出結(jié)果如下(結(jié)果內(nèi)存值不帶小數(shù)點(diǎn),此處添加小數(shù)點(diǎn)的目的是為了便于比對大小):
root@phone:/ # cat /proc/meminfo
MemTotal: 2857.032 kB //RAM可用的總大小 (即物理總內(nèi)存減去系統(tǒng)預(yù)留和內(nèi)核二進(jìn)制代碼大小)
MemFree: 1020.708 kB //RAM未使用的大小
Buffers: 75.104 kB //用于文件緩沖
Cached: 448.244 kB //用于高速緩存
SwapCached: 0 kB //用于swap緩存
Active: 832.900 kB //活躍使用狀態(tài)找爱,記錄最近使用過的內(nèi)存梗顺,通常不回收用于其它目的
Inactive: 391.128 kB //非活躍使用狀態(tài),記錄最近并沒有使用過的內(nèi)存缴允,能夠被回收用于其他目的
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 //匿名頁荚守,用戶空間的頁表,沒有對應(yīng)的文件
Mapped: 187.096 kB //文件通過mmap分配的內(nèi)存练般,用于map設(shè)備矗漾、文件或者庫
Shmem: .312 kB
Slab: 91.276 kB //kernel數(shù)據(jù)結(jié)構(gòu)的緩存大小,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 //不穩(wěn)定頁表的大小
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1952.800 kB
Committed_AS: 82204.348 kB //評估完成的工作量薄料,代表最糟糕case下的值敞贡,該值也包含swap內(nèi)存
VmallocTotal: 251658.176 kB //總分配的虛擬地址空間
VmallocUsed: 166.648 kB //已使用的虛擬地址空間
VmallocChunk: 251398.700 kB //虛擬地址空間可用的最大連續(xù)內(nèi)存塊
對于cache和buffer也是系統(tǒng)可以使用的內(nèi)存。所以系統(tǒng)總的可用內(nèi)存為 MemFree+Buffers+Cached
4.free
主功能:查看可用內(nèi)存摄职,缺省單位KB誊役。該命令比較簡單、輕量谷市,專注于查看剩余內(nèi)存情況蛔垢。數(shù)據(jù)來源于/proc/meminfo。
輸出結(jié)果:
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
行迫悠,存在的公式關(guān)系: total = used + free; - 對于
-/+ buffers
行: 1760936 = 1836040 - 75104(buffers); 1096096 = 1020992 + 75104(buffers);
5. showmap
主功能:用于查看虛擬地址區(qū)域的內(nèi)存情況
用法: showmap -a [pid]
該命令的輸出每一行代表一個(gè)虛擬地址區(qū)域(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:分別代表進(jìn)程空間的起止虛擬地址鹏漆;
- virtual size/ RSS /PSS這些前面介紹過;
- shared clean:代表多個(gè)進(jìn)程的虛擬地址可指向這塊物理空間,即有多少個(gè)進(jìn)程共享這個(gè)庫艺玲;
- shared: 共享數(shù)據(jù)
- private: 該進(jìn)程私有數(shù)據(jù)
- clean: 干凈數(shù)據(jù)括蝠,是指該內(nèi)存數(shù)據(jù)與disk數(shù)據(jù)一致,當(dāng)內(nèi)存緊張時(shí)饭聚,可直接釋放內(nèi)存忌警,不需要回寫到disk
- dirty: 臟數(shù)據(jù),與disk數(shù)據(jù)不一致秒梳,需要先回寫到disk法绵,才能被釋放。
功能與cat /proc/[pid]/maps
基本一致端幼。
6. vmstat
主功能:不僅可以查看內(nèi)存情況礼烈,還可以查看進(jìn)程運(yùn)行隊(duì)列、系統(tǒng)切換婆跑、CPU時(shí)間占比等情況,另外該指令還是周期性地動(dòng)態(tài)輸出庭呜。
用法:
Usage: vmstat [ -n iterations ] [ -d delay ] [ -r header_repeat ]
-n iterations 數(shù)據(jù)循環(huán)輸出的次數(shù)
-d delay 兩次數(shù)據(jù)間的延遲時(shí)長(單位:S)
-r header_repeat 循環(huán)多少次滑进,再輸出一次頭信息行
輸入結(jié)果:
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
參數(shù)列總共15個(gè)參數(shù),分為4大類:
- procs(進(jìn)程)
- r: Running隊(duì)列中進(jìn)程數(shù)量
- b: IO wait的進(jìn)程數(shù)量
- memory(內(nèi)存)
- free: 可用內(nèi)存大小
- mapped:mmap映射的內(nèi)存大小
- anon: 匿名內(nèi)存大小
- slab: slab的內(nèi)存大小
- system(系統(tǒng))
- in: 每秒的中斷次數(shù)(包括時(shí)鐘中斷)
- cs: 每秒上下文切換的次數(shù)
- cpu(處理器)
- us: user time
- ni: nice time
- sy: system time
- id: idle time
- wa: iowait time
- ir: interrupt time
小結(jié)
-
dumpsys meminfo
適用場景: 查看進(jìn)程的oom adj募谎,或者dalvik/native等區(qū)域內(nèi)存情況扶关,或者某個(gè)進(jìn)程或apk的內(nèi)存情況,功能非常強(qiáng)大数冬; -
procrank
適用場景: 查看進(jìn)程的VSS/RSS/PSS/USS各個(gè)內(nèi)存指標(biāo)节槐; -
cat /proc/meminfo
適用場景: 查看系統(tǒng)的詳盡內(nèi)存信息,包含內(nèi)核情況拐纱; -
free
適用場景: 只查看系統(tǒng)的可用內(nèi)存铜异; -
showmap
適用場景: 查看進(jìn)程的虛擬地址空間的內(nèi)存分配情況; -
vmstat
適用場景: 周期性地打印出進(jìn)程運(yùn)行隊(duì)列秸架、系統(tǒng)切換揍庄、CPU時(shí)間占比等情況;
http://gityuan.com/2016/01/02/memory-analysis-command/#%E4%B8%80%E6%A6%82%E8%BF%B0