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。如下圖。