在Android的性能優化過程,我們經常會使用一些命令來查看系統內存,或者查看某個app使用的內存信息。我經常使用的幾個查看內存的命令有:
今天來分析一下這幾個命令的區別,希望大家以後可以根據自己的需要,選擇使用最合適的命令。
USS: 進程獨佔的內存,不包含使用共享庫所在的內存(物理內存)
PSS: USS + 使用的共享庫均分到每個使用它的進程中的內存(物理內存)
RSS:PSS + 共享庫佔用的內存(物理內存)
VSS:進程佔用的虛擬內存,很少使用它來分析內存
dumpsys meminfo命令有兩種用法,可以直接使用,也可以後面加進程名使用,如dumpsys meminfo com.bestv.ott。
先看下直接使用dumpsys meminfo的輸出:
shell@almond:/ # dumpsys meminfoApplications Memory Usage (kB):Uptime: 2116886 Realtime: 2116886Total PSS by process: 97381 kB: com.bestv.ott (pid 2254 / activities) 44505 kB: tv.fun.settings (pid 3222) 39582 kB: tv.fun.ottsecurity (pid 2279) 33393 kB: com.bestv.voice.Assist:ASR (pid 3133) 21879 kB: system (pid 1757) 20801 kB: tvos (pid 1151) 16724 kB: com.baidu.input_baidutv (pid 2157) ... ...Total PSS by OOM adjustment: 65215 kB: Native 20801 kB: tvos (pid 1151) 12942 kB: zygote (pid 1132) ... ... 171296 kB: Persistent 97381 kB: com.bestv.ott (pid 2254 / activities) ... ... 12795 kB: Foreground 5967 kB: tv.fun.weather (pid 2569) 4017 kB: tv.fun.children (pid 2582) 2811 kB: com.mstar.android.providers.tv (pid 2428) 53286 kB: Visible 44505 kB: tv.fun.settings (pid 3222) 8781 kB: com.android.bluetooth (pid 2714) 74607 kB: Perceptible 33393 kB: com.bestv.voice.Assist:ASR (pid 3133) 16724 kB: com.baidu.input_baidutv (pid 2157) ... ... 39582 kB: A Services 39582 kB: tv.fun.ottsecurity (pid 2279) 14861 kB: B Services 5096 kB: com.funshion.publicity (pid 3870) 4115 kB: tv.fun.sdkmanager (pid 3302) ... ... 8983 kB: Cached 6200 kB: tv.fun.appstore (pid 4119) 2783 kB: tv.fun.master:daemon (pid 4288)Total PSS by category: 147653 kB: Dalvik 114890 kB: Native 49193 kB: .so mmap ... ...Total RAM: 1995144 kB Free RAM: 1209135 kB (8983 cached pss + 562536 cached + 637616 free) Used RAM: 472302 kB (431642 used pss + 40660 kernel) Lost RAM: 313707 kB Tuning: 96 (large 256), oom 122880 kB, restore limit 40960 kB (high-end-gfx)
以上是直接使用dumpsys meminfo命令列印出的系統內存信息,它從不同的角度列印出系統中內存佔用的信息。
dumpsys meminfo還可以列出某個進程的詳細內存佔用信息,如dumpsys meminfo com.bestv.ott:
shell@almond:/ # dumpsys meminfo com.bestv.ott Applications Memory Usage (kB):Uptime: 3780175 Realtime: 3780175** MEMINFO in pid 2254 [com.bestv.ott] ** Pss Private Private Swapped Heap Heap Heap Total Dirty Clean Dirty Size Alloc Free - - - - - - - Native Heap 33807 33788 0 0 35040 34156 791 Dalvik Heap 36155 36056 0 0 42900 35608 7292 Dalvik Other 4012 3892 0 0 Stack 444 444 0 0 Other dev 5 0 4 0 .so mmap 3694 352 2280 0 .apk mmap 10327 0 10132 0 .ttf mmap 1542 0 1300 0 .dex mmap 4498 40 3608 0 Other mmap 29 4 4 0 Unknown 176 176 0 0 TOTAL 94689 74752 17328 0 77940 69764 8083 Objects Views: 750 ViewRootImpl: 1 AppContexts: 4 Activities: 1 Assets: 4 AssetManagers: 4 Local Binders: 34 Proxy Binders: 37 Death Recipients: 1 OpenSSL Sockets: 0 SQL MEMORY_USED: 482 PAGECACHE_OVERFLOW: 107 MALLOC_SIZE: 62 DATABASES pgsz dbsz Lookaside(b) cache Dbname 4 20 80 3/16/2 /data/data/com.bestv.ott/databases/tv_message.db 4 16 32 229/18/4 /data/data/com.bestv.ott/databases/host.db 4 20 142 13/18/4 /data/data/com.bestv.ott/databases/tv_message.db 4 80 500 654/31/17 /data/data/com.bestv.ott/databases/funtv.db Asset Allocations zip:/system/app/TVLauncher.apk:/assets/fonts/iconfont.ttf: 77K zip:/system/app/TVLauncher.apk:/assets/fonts/SourceHanSerifCN-Bold.otf: 11497K
這裡可以很清楚的看到com.bestv.ott進程佔用的內存的詳細分布。比如可以看到使用的ttf字體佔用的PSS內存,進程佔用的native堆的大小,還有Dalvik堆的大小。當發生內存洩露時,這個命令可以幫助我們分析具體在哪一部分產生了內存洩露。
procrank命令也可以輸出所有進程的內存佔用信息,並按照PSS大小排序。但是相比dumpsys meminfo,procrank的優勢在於,它可以詳細的列出每個進程的USS/RSS/PSS/VSS信息。其中最有價值的就是USS信息,前面說過,它表示進程獨佔的物理內存,通過觀察它的變化,可以發現進程是否有內存洩露。
procrank的輸出結果如下:
shell@almond:/ # procrank warning: could not create process interface for 4762 PID Vss Rss Pss Uss cmdline 2254 655824K 123292K 97321K 94556K com.bestv.ott 3222 568052K 69072K 44845K 42692K tv.fun.settings 2279 515356K 60064K 40140K 39244K tv.fun.ottsecurity 3133 552640K 51928K 33508K 32280K com.bestv.voice.Assist:ASR ... ... - - - 447816K 396148K TOTALRAM: 1995144K total, 630880K free, 21628K buffers, 653904K cached, 3264K shmem, 20924K slab
所以我經常使用procrank來監測進程是否有內存洩露發生。
free命令可以輸出系統整體的內存佔用情況,free的輸出如下:
shell@almond:/ # busybox free total used free shared buffersMem: 1995144 1356552 638592 0 21956
-/+ buffers: 1334596 660548
Swap: 0 0 0
free命令輸出的第二行和第三行都是系統的內存信息,但是略有區別:
所以free命令可以查看當前系統總共還有多少可用內存。
cat /proc/meminfo命令相比於free,可以更詳細的列出系統當前的內存分部狀況。其輸出如下:
shell@almond:/ # cat /proc/meminfo MemTotal: 1995144 kBMemFree: 637600 kBBuffers: 22652 kBCached: 653904 kBSwapCached: 0 kBActive: 417636 kBInactive: 588160 kBActive(anon): 329244 kBInactive(anon): 3228 kBActive(file): 88392 kBInactive(file): 584932 kBUnevictable: 0 kBMlocked: 0 kBHighTotal: 1245184 kBHighFree: 147988 kBLowTotal: 749960 kBLowFree: 489612 kBSwapTotal: 0 kBSwapFree: 0 kBDirty: 4 kBWriteback: 0 kBAnonPages: 329232 kBMapped: 110824 kBShmem: 3264 kBSlab: 20952 kBSReclaimable: 8164 kBSUnreclaim: 12788 kBKernelStack: 6424 kBPageTables: 10076 kBNFS_Unstable: 0 kBBounce: 0 kBWritebackTmp: 0 kBCommitLimit: 997572 kBCommitted_AS: 13344600 kBVmallocTotal: 245760 kBVmallocUsed: 70112 kBVmallocChunk: 47104 kBCMA Free: 252516 kB CMA heap info(name,alloc,in cache,fail,total free): DEFAULT_CMA_BUFFER (284kb 0kb 0kb 16100kb) RETURN_ENUM0 (25600kb 0kb 0kb 7168kb) OTHERS (32768kb 0kb 0kb 0kb) VDEC_XC_STR_MBOOT (0kb 0kb 0kb 98304kb) RETURN_ENUM2 (0kb 0kb 0kb 20480kb) VDEC_XC1 (0kb 0kb 0kb 110592kb)
同free命令類似,系統此時真正的可用內存是MemFree + Buffers + Cached。