Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android內存分析命令使用教程

Android內存分析命令使用教程

編輯:關於Android編程

一、概述

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 內存分析命令

常用的內存調優分析命令:

  1. dumpsys meminfo
  2. procrank
  3. cat /proc/meminfo
  4. free
  5. showmap
  6. 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 - 總內存、剩余內存、可用內存、其他內存

命令內容:

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的進程信息:

dumpsys meminfo <pid> // 輸出指定pid的某一進程
dumpsys meminfo --package <packagename> // 輸出指定包名的進程,可能包含多個進程

2. procrank

功能: 獲取所有進程的內存使用的排行榜,排行是以Pss的大小而排序。procrank命令比dumpsys meminfo命令,能輸出更詳細的VSS/RSS/PSS/USS內存指標。

最後一行輸出下面6個指標:

total free buffers cached shmem slab

執行結果:

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

功能:能否查看更加詳細的內存信息

指令: cat /proc/meminfo

輸出結果如下(結果內存值不帶小數點,此處添加小數點的目的是為了便於比對大小):

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  //不穩定頁表的大小
Bounce:                 0 kB
WritebackTmp:           0 kB
CommitLimit:     1952.800 kB
Committed_AS:   82204.348 kB   //評估完成的工作量,代表最糟糕case下的值,該值也包含swap內存

VmallocTotal:  251658.176 kB  //總分配的虛擬地址空間
VmallocUsed:      166.648 kB  //已使用的虛擬地址空間
VmallocChunk:  251398.700 kB  //虛擬地址空間可用的最大連續內存塊

對於cache和buffer也是系統可以使用的內存。所以系統總的可用內存為 MemFree+Buffers+Cached

4.free

主功能:查看可用內存,缺省單位KB。該命令比較簡單、輕量,專注於查看剩余內存情況。數據來源於/proc/meminfo。

輸出結果:

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行,存在的公式關系: total = used + free;
  • 對於-/+ buffers行: 1760936 = 1836040 - 75104(buffers); 1096096 = 1020992 + 75104(buffers);

5. showmap

主功能:用於查看虛擬地址區域的內存情況

用法:  showmap -a [pid]

該命令的輸出每一行代表一個虛擬地址區域(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:分別代表進程空間的起止虛擬地址;
  • virtual size/ RSS /PSS這些前面介紹過;
  • shared clean:代表多個進程的虛擬地址可指向這塊物理空間,即有多少個進程共享這個庫;
  • shared: 共享數據
  • private: 該進程私有數據
  • clean: 干淨數據,是指該內存數據與disk數據一致,當內存緊張時,可直接釋放內存,不需要回寫到disk
  • dirty: 髒數據,與disk數據不一致,需要先回寫到disk,才能被釋放。

功能與cat /proc/[pid]/maps基本一致。

6. vmstat

主功能:不僅可以查看內存情況,還可以查看進程運行隊列、系統切換、CPU時間占比等情況,另外該指令還是周期性地動態輸出。

用法:

Usage: vmstat [ -n iterations ] [ -d delay ] [ -r header_repeat ]
    -n iterations     數據循環輸出的次數
    -d delay          兩次數據間的延遲時長(單位:S)
    -r header_repeat  循環多少次,再輸出一次頭信息行

輸入結果:

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

參數列總共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

小結

  1. dumpsys meminfo適用場景: 查看進程的oom adj,或者dalvik/native等區域內存情況,或者某個進程或apk的內存情況,功能非常強大;
  2. procrank適用場景: 查看進程的VSS/RSS/PSS/USS各個內存指標;
  3. cat /proc/meminfo適用場景: 查看系統的詳盡內存信息,包含內核情況;
  4. free適用場景: 只查看系統的可用內存;
  5. showmap適用場景: 查看進程的虛擬地址空間的內存分配情況;
  6. vmstat適用場景: 周期性地打印出進程運行隊列、系統切換、CPU時間占比等情況;
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved