在分析Android内存前,需要先了解这几个Linux 内存概念.
如果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.
如果你想查看进程的内存使用情况,可以使用"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
...
我们可以在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的区别是,该部分数据与磁盘数据是一致的,不需要回写即可回收该区域内存。
如上dumpsys meminfo虽然内容详细,但是使用起来比较麻烦,并且需要不能实时查看。
QTrace(下载:http://www.qtrace.top)的ADB Monitor则可以实时跟踪meminfo的信息,并以图表的方式进行展示。
点击菜单:View->Plugin->ADB Monitor.
设置要监视的项:
可设置多个监视项,按finish完成设置。
选择进程后,实时监视meminfo。如下图。