天天看點

Android程序記憶體分析VSS,RSS,PSS,USSdumpsys meminfoQTrace動态檢視 meminfo

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.

設定要監視的項:

Android程式記憶體分析VSS,RSS,PSS,USSdumpsys meminfoQTrace動态檢視 meminfo

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-Awztrkwm-1596079659371)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

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

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

Android程式記憶體分析VSS,RSS,PSS,USSdumpsys meminfoQTrace動态檢視 meminfo

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-r3oUlzzz-1596079659374)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]