1. 程式人生 > >Android 記憶體分析

Android 記憶體分析

VSS,RSS,PSS,USS

   在分析Android記憶體前,需要先了解這幾個Linux 記憶體概念.

  • Vss是佔用的虛擬記憶體,如果沒有對映實際的記憶體也算進來。

如果VSS這個概念不好理解,那麼參考如下這段:          VSS (reported as VSZ from ps) is the total accessible address space of a process.This size also includes memory that may not be resident in RAM like mallocs that have been allocated but not written to. VSS is of very little use for determing real memory usage of a process.

  • Rss是佔用的實體記憶體。是共享記憶體+私有記憶體。因為共享記憶體是多個程序共用的,所以存在重複計算。
  • Pss是佔用的私有記憶體加上平分的共享記憶體。例如一塊1M的共享記憶體被兩個程序共享,那每個程序分500K。各程序的Pss相加基本等於實際被使用的實體記憶體,所以這個經常是最重要的引數。
  • Uss是私有記憶體。

如果你想檢視程序的記憶體使用情況,可以使用"adb shell procrank"命令

PID       Vss      Rss      Pss      Uss  cmdline   315    54800K       0K       0K       0K  /system/bin/vold   356    10776K       0K       0K       0K  /system/bin/lmkd   359    14820K       0K       0K       0K  /system/bin/tctd   540    45712K       0K       0K       0K  /system/bin/netd ...

dumpsys meminfo

我們可以在adb shell 中執行dumpsys meminfo命令來得到更詳細的程序的記憶體資訊。

:~$  adb shell dumpsys  meminfo system_server

Applications Memory Usage (in Kilobytes): Uptime: 26275832 Realtime: 248813406                    Pss  Private  Private  SwapPss     Heap     Heap     Heap                  Total    Dirty    Clean    Dirty     Size    Alloc     Free                 ------   ------   ------   ------   ------   ------   ------   Native Heap    19370    19304        0        0        0        0        0   Dalvik Heap    40233    40080        0        0        0        0        0  Dalvik Other     3905     3904        0        0                                    Stack     2144     2144        0        0                                   Ashmem     2661     2592        0        0                                Other dev       22        0        4        0                                 .so mmap     4248      388     1168        0                                .apk mmap     1714        0     1316        0                                .dex mmap    36161       36    36060        0                                .oat mmap     6169        0      664        0                                .art mmap     2349     1948        4        0                               Other mmap      540        4       88        0                               EGL mtrack      940      940        0        0                                GL mtrack      600      600        0        0                                  Unknown     3119     3116        0        0                                    TOTAL   124175    75056    39304        0        0        0        0    App Summary                        Pss(KB)                         ------            Java Heap:    42032          Native Heap:    19304                 Code:    39632                Stack:     2144             Graphics:     1540        Private Other:     9708               System:     9815                  TOTAL:   124175       TOTAL SWAP PSS:        0

Android程式記憶體被分為2部分:native和dalvik,dalvik就是我們平常說的java堆.

Naitve Heap Size: 從mallinfo usmblks獲得,代表最大總共分配空間

Native Heap Alloc: 從mallinfo uorblks獲得,總共分配空間

Native Heap Free: 從mallinfo fordblks獲得,代表總共剩餘空間 

Native Heap Size 約等於Native Heap Alloc + Native Heap Free

mallinfo是一個C庫, mallinfo 函式提供了各種各樣的通過C的malloc()函式分配的記憶體的統計資訊。

Dalvik Heap Size:從Runtime totalMemory()獲得,Dalvik Heap總共的記憶體大小。

Dalvik Heap Alloc: Runtime totalMemory()-freeMemory() ,Dalvik Heap分配的記憶體大小。

Dalvik Heap Free:從Runtime freeMemory()獲得,Dalvik Heap剩餘的記憶體大小。

Dalvik Heap Size 約等於Dalvik  Heap Alloc + Dalvik  Heap Free

Private Dirty: 是最為重要的,因為該部分所有的內容都只處於RAM中,不會使用分頁機制將其map到硬碟。Private Dirty RAM包含,所有在App內部(也就是說不包含系統建立的)所建立的Native Heap和Dalvik Heap。而與Zygote程序共享的記憶體區域為Shared/Swapped Dirty RAM。

Private Clean:與Private Dirty的區別是,該部分資料與磁碟資料是一致的,不需要回寫即可回收該區域記憶體。

QTrace動態檢視 meminfo

如上dumpsys meminfo雖然內容詳細,但是使用起來比較麻煩,並且需要不能實時檢視。

QTrace(下載:http://www.qtrace.top)的ADB Monitor則可以實時跟蹤meminfo的資訊,並以圖表的方式進行展示。

點選選單:View->Plugin->ADB Monitor.

設定要監視的項:

可設定多個監視項,按finish完成設定。

選擇程序後,實時監視meminfo。如下圖。