內存相關概念解析
一個進程佔用了多少內存,主要有下述四種說法:
-
VSS(Virtual Set Size),虛擬內存。RSS + 未分配實際物理內存
單個進程可訪問的全部虛擬內存地址空間,其大小包括未實際申請的物理內存。
-
RSS(Resident Set Size),物理內存。USS + 包含共享庫
單個進程實際佔用的內存大小,RSS不太準確的地方在於它包括該進程所使用共享庫全部內存大小。對於一個共享庫,可能被多個進程使用,實際該共享庫只會被裝入內存一次。
-
PSS(Proportional Set Size),物理內存。USS + 按比例包含共享庫
PSS相對於RSS計算共享庫內存大小是按比例的。N個進程共享,該庫對PSS大小的貢獻只有1/N。
-
USS(Unique Set Size),物理內存。進程獨佔的內存
單個進程私有的內存大小,即該進程獨佔的內存部分。USS表示運行一個特定進程的真實內存增量大小,如果進程終止,USS就是實際被返還給系統的內存大小。
dumpsys meminfo
查看指定進程的內存信息:dumpsys meminfo [pid]
Applications Memory Usage (in Kilobytes):
Uptime: 2455033 Realtime: 2455033
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 212 184 28 36524 0 0 0
Dalvik Heap 0 0 0 0 0 0 0
Stack 4 0 4 740
Other dev 9 0 0 0
.so mmap 36266 16 35460 5740
Other mmap 12 0 8 52
Unknown 64 36 28 6708
TOTAL 86331 236 35528 49764 0 0 0
App Summary
Pss(KB)
------
Java Heap: 0
Native Heap: 184
Code: 35476
Stack: 0
Graphics: 0
Private Other: 104
System: 50567
TOTAL: 86331 TOTAL SWAP PSS: 49764
Android heap上的內存分爲兩塊:native和dalvik。dalvik就是我們平常說的java堆,Java對象分配佔據的內存;Native代碼分配的內存,虛擬機和Android框架分配內存。
procrank
獲取所有進程的內存使用的排行榜,排行是以Pss的大小而排序。procrank命令比dumpsys meminfo命令,能輸出更詳細的VSS/RSS/PSS/USS內存指標。
PID Vss Rss Pss Uss Swap PSwap USwap ZSwap cmdline
2572 4757048K 280016K 156987K 147300K 8916K 145K 0K 37K com.bbk.launcher2
2548 4276448K 293992K 153739K 140888K 8852K 151K 8K 39K com.android.systemui
1037 4887848K 272952K 138643K 128120K 17688K 9001K 8852K 2328K system_server
3492 1321548K 132312K 51964K 46528K 7004K 476K 0K 123K com.vivo.globalsearch
......
RAM: 7801436K total, 3109936K free, 9560K buffers, 2247508K cached, 3468K shmem, 836080K slab
USS是進程獨自佔用的物理內存(不包含共享庫佔用的內存),它是一個非常非常有用的數字, 揭示了運行一個特定進程的真實的內存增量大小。如果進程被終止, USS 就是實際被返還給系統的內存大小。
USS 是針對某個進程開始有可疑內存泄露的情況,進行檢測的最佳數字。懷疑某個程序有內存泄露可以查看這個值是否一直有增加。
cat /proc/meminfo
查看系統的詳盡內存信息,包含內核情況
MemTotal: 7801436 kB //總內存
MemFree: 3104012 kB //空閒內存
MemAvailable: 5242416 kB
Buffers: 9560 kB //給文件的緩衝大小
Cached: 2249552 kB
SwapCached: 8640 kB
Active: 792860 kB
Inactive: 2345844 kB
Active(anon): 419236 kB
Inactive(anon): 466352 kB
Active(file): 373624 kB
Inactive(file): 1879492 kB
Unevictable: 3260 kB
Mlocked: 3260 kB
SwapTotal: 2097148 kB
SwapFree: 1808416 kB
Dirty: 64 kB //等待被寫回到磁盤的大小
Writeback: 0 kB
AnonPages: 878096 kB
Mapped: 851592 kB
Shmem: 3468 kB
Slab: 836120 kB
SReclaimable: 121448 kB
SUnreclaim: 714672 kB
KernelStack: 48836 kB
PageTables: 71760 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 5997864 kB
Committed_AS: 108413340 kB
VmallocTotal: 263061440 kB //虛擬內存大小
VmallocUsed: 0 kB
VmallocChunk: 0 kB
CmaTotal: 299008 kB
CmaFree: 199368 kB
RSCISF: 261120 kB
RSCIBF: 110560 kB
NR_KMALLOC: 19840 kB
NR_VMALLOC: 80372 kB
NR_DMA_NOR: 0 kB
NR_DMA_CMA: 95548 kB
NR_ION: 161148 kB
free_ion: 10092 kB
free_ion_pool: 10092 kB
free_ion_heap: 0 kB
NR_GPU: 136452 kB
free_gpu: 21896 kB
o0a1r0: 120 kB
o1a1r0: 21776 kB
o4a0r256: 0 kB
o8a0r32: 0 kB
zram_size: 74708 kB
pcppages: 3788 kB
ALL_MEM: 7778432 kB
free
查看可用內存,缺省單位KB。該命令比較簡單、輕量,專注於查看剩餘內存情況。數據來源於/proc/meminfo。
total used free shared buffers
Mem: 7988670464 4812099584 3176570880 3551232 9789440
-/+ buffers/cache: 4802310144 3186360320
Swap: 2147479552 295645184 1851834368
vmstat
不僅可以查看內存情況,還可以查看進程運行隊列、系統切換、CPU時間佔比等情況,另外該指令還是週期性地動態輸出。
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
3 0 1243544 400116 12276 5343880 9 19 41 53 1 465 12 12 76 0
參數列總共15個參數,分爲4大類:
- procs(進程)
- r: Running隊列中進程數量
- b: IO wait的進程數量
- memory(內存)
- swpd: 虛擬內存使用大小
- free: 空閒內存大小
- buff:用作buffer的內存大小
- cache: 用作cache的內存大小
- IO:
- bi: Blocks received from a block device (blocks/s).
- bo: Blocks sent to a block device (blocks/s).
- system(系統)
- in: 每秒的中斷次數(包括時鐘中斷)
- cs: 每秒上下文切換的次數
- cpu(處理器)
- us: user time
- ni: nice time
- sy: system time
- id: idle time
- wa: iowait time
- ir: interrupt time
參考:
http://gityuan.com/2016/01/02/memory-analysis-command/
https://www.cnblogs.com/arnoldlu/p/9375377.html