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.

设置要监视的项:

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Awztrkwm-1596079659371)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

可设置多个监视项,按finish完成设置。

选择进程后,实时监视meminfo。如下图。

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r3oUlzzz-1596079659374)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页