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.

设置要监视的项:

Android 内存分析_第1张图片

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

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

Android 内存分析_第2张图片

 

你可能感兴趣的:(QTrace)