Android系統查看內存命令

2021-02-14 進擊獨立開發者

在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。

相關焦點

  • Android 內存分析之二--使用adb命令查看內存
    使用adb命令查看內存2.1使用dumpsys meminfo命令dumpsys命令是android中用於列印service相關狀態信息的命令,它的原理是Android中系統相關service通過重寫dump接口來實現的。
  • Android 內存分析之二--使用adb命令查看內存 作者:晨光
    1.使用adb命令查看內存1.1使用dumpsys meminfo命令dumpsys命令是android中用於列印service相關狀態信息的命令,它的原理是Android中系統相關service通過重寫dump接口來實現的。dumpsys功能比較強大,本文只對其查看內存信息的功能做介紹,其他的功能不做過多闡述。
  • Linux系統命令 - 查看內存使用情況
    ;buff/cache 表示緩存和緩衝內存量; Linux 系統會將很多東西緩存起來以提高性能,這部分內存可以在必要時進行釋放,給其他程序使用。available 表示可用內存;輸出結果很容易理解。Swap 這一行表示交換內存,從示例中的數字可以看到,基本上沒使用到交換內存。2.
  • 來點乾貨 | Android 常見內存洩漏與優化(二)
    這裡我們主要介紹Android Profiler中的Memory Profiler組件,它對應於Android Monitor的Memory Monitor,通過Memory Profiler可以實時查看/捕獲存儲內存的使用狀態、強制GC以及跟蹤內存分配情況,以便於快速地識別可能會導致應用卡頓、凍結甚至崩潰的內存洩漏和內存抖動。
  • Android native內存檢測工具介紹
    檢測工具不僅可以在驗證時發現安全問題,也可以在運用場景中阻斷安全問題的發生,對於安全問題檢測和攻擊攔截非常友好,當然安全檢測功能會消耗一定的系統性能。本文將對已集成的部分檢測工具進行介紹。Android系統添加了clang的編譯特性,使C/C++代碼編譯時可以添加檢測功能,針對內存安全問題進行檢測。
  • Linux如何查看內存的使用情況?
    本節將介紹幾個系統命令,通過它們,可以快速查看 Linux 系統中內存的使用狀況。Linux查看內存使用情況:free命令free 是監控 Linux 內存使用狀況最常用的命令之一,有關該命令的基本用法,已經在《Linux free命令》一節中做了詳細介紹,所以不再贅述,這裡重點給大家講解如何使用 free 命令查看系統內存的使用情況。
  • Android ADB命令?這一次我再也不死記了!
    adb的全稱為Android Debug Bridge.是android司機經常用到的工具.但是問題是那麼多命令寫代碼已經夠費勁了,過段時間在次使用時壓根記不住呀.本次的大餐就是為此開篇的.這一次我們不記命令.要用隨時過來
  • Linux 系統下查看硬體信息命令大全
    有許多命令可以用來查看 Linux 系統上的硬體信息。
  • 安卓測試常用的 ADB 命令大全,非常全!
    4.從Android仿真器中回傳文件到電腦 通過adb pull /tmp/android123.txt android123.txt命令就會把仿真器的tmp文件夾下android123.txt文件回傳到電腦SDK/Tools目錄下。3、常用命令大全 1.
  • ADB命令手冊大全
    停止 adb server 命令:adb kill-server查看 adb 版本命令:adb version示例輸出:Android Debug Bridge version 1.0.36Revision 8f855a3d9b35-android以 root
  • Linux 查看進程消耗內存情況總結
    在Linux中,有很多命令或工具用來查看內存使用情況,今天我們來簡單討論一下如何查看進程消耗、佔用的內存情況,Linux的內存管理和相關概念要比Windows複雜一些。在此之前,我們需要了解一下Linux系統下面有關內存的專用名詞和專業術語概念:物理內存和虛擬內存 物理內存:就是系統硬體提供的內存大小,是真正的內存,一般叫做內存條。
  • 在VMware中安裝android-x86-9.0-r2
    android x86(https://www.android-x86.org/) 是一個自由而開源的項目,將谷歌製作的安卓系統從ARM架構移植到x86
  • Linux下查看內存的使用情況
    Linux下使用什麼方法來查看內存的使用情況呢?
  • Linux下查看內存使用情況方法總結
    Q:我想監視Linux系統的內存使用情況,在Linux下有哪些視圖或者命令行工具可用呢?
  • 史上最全 | Android 常用 adb 命令總結
    ,需要 root ,並且一般的 Android 機 root 之後並不能使用命令去複製,而需要在手機上使用類似於 RE 的文件瀏覽器,先對系統的文件系統進行掛載為可讀寫後,才能在手機上複製移動系統文件,這裡推薦使用小米手機的開發版本。
  • 掌握 Android 系統架構,看這一篇就夠了!| 技術頭條
    當然本站有一些文章沒來得及進一步加工,有時間根據大家的反饋,不斷修正和完善所有文章,爭取給文章,再進一步精簡非核心代碼,增加可視化圖表以及文字的結論性分析。基於Android 6.0的源碼,專注於分享Android系統原理、架構分析的原創文章。
  • 必須掌握的ADB命令 | 讓你的測試事半功倍
    該命令會生成hprof文件,該文件可以通過Memory Analysis或者Android Studio打開,文件內記載了不同數據類型等內存的使用情況,通過該文件我們可以分析到內存洩露或者值得優化的地方。
  • Linux如何查看內存佔用情況
    Linux下查看某一個進程所佔用的內存,首先可以通過 ps 命令找到進程 id,比如 ps -ef | grep sender_main_test_strategy_newhot.py 可以看到進程對應的 id 為 30501。ylhao 30501 1 0 Jun04 ?
  • 探討Android6.0及以上系統APP保活實現
    及以上系統APP常駐內存(保活)實現-復活篇http://blog.csdn.net/andrexpert/article/details/75174586APP常駐內存(保活),舊事重提,距離上一次的研究亦有半年有餘。
  • 手機測試必備的ADB命令手冊大全
    如下是部分系統預定義廣播及正常觸發時機:action觸發時機android.net.conn.CONNECTIVITY_CHANGE網絡連接發生變化android.intent.action.SCREEN_ON屏幕點亮android.intent.action.SCREEN_OFF屏幕熄滅強制停止應用命令:adb shell am force-stop <packagename