Android 內(nèi)存分析命令

一、概述

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)分析命令:

  1. dumpsys meminfo
  2. procrank
  3. cat /proc/meminfo
  4. free
  5. showmap
  6. 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é)

  1. dumpsys meminfo適用場景: 查看進(jìn)程的oom adj募谎,或者dalvik/native等區(qū)域內(nèi)存情況扶关,或者某個(gè)進(jìn)程或apk的內(nèi)存情況,功能非常強(qiáng)大数冬;
  2. procrank適用場景: 查看進(jìn)程的VSS/RSS/PSS/USS各個(gè)內(nèi)存指標(biāo)节槐;
  3. cat /proc/meminfo適用場景: 查看系統(tǒng)的詳盡內(nèi)存信息,包含內(nèi)核情況拐纱;
  4. free適用場景: 只查看系統(tǒng)的可用內(nèi)存铜异;
  5. showmap適用場景: 查看進(jìn)程的虛擬地址空間的內(nèi)存分配情況;
  6. 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末东抹,一起剝皮案震驚了整個(gè)濱河市蚂子,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缭黔,老刑警劉巖食茎,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馏谨,居然都是意外死亡别渔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钠糊,“玉大人挟秤,你說我怎么就攤上這事〕椋” “怎么了艘刚?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長截珍。 經(jīng)常有香客問我攀甚,道長,這世上最難降的妖魔是什么岗喉? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任秋度,我火速辦了婚禮,結(jié)果婚禮上钱床,老公的妹妹穿的比我還像新娘荚斯。我一直安慰自己,他們只是感情好查牌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布事期。 她就那樣靜靜地躺著,像睡著了一般纸颜。 火紅的嫁衣襯著肌膚如雪兽泣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天胁孙,我揣著相機(jī)與錄音唠倦,去河邊找鬼。 笑死涮较,一個(gè)胖子當(dāng)著我的面吹牛稠鼻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播法希,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼枷餐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苫亦?” 一聲冷哼從身側(cè)響起毛肋,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屋剑,沒想到半個(gè)月后润匙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唉匾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年孕讳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匠楚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厂财,死狀恐怖芋簿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情璃饱,我是刑警寧澤与斤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站荚恶,受9級特大地震影響撩穿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谒撼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一食寡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧廓潜,春花似錦抵皱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至堪澎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間味滞,已是汗流浹背樱蛤。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剑鞍,地道東北人昨凡。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蚁署,于是被迫代替她去往敵國和親便脊。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容