android内存剖析

本文主要介绍

  • 操作体系的内存办理部分常识
  • 执行命令 adb shell dumpsys meminfo [进程名] 得到信息的相关剖析
    • private dirty
    • private clean
    • RSS
    • PSS
    • Swap pss

前置常识

操作体系的内存办理

Android内存分析

  • 一个进程的实践数据存在RAM(内存)和ROM(存储空间)。之所以需求再ROM里存储是由于RAM是稀缺资源。
  • 为了安全考虑,面向用户的往往是虚拟地址,从虚拟地址查找实践物理地址,需求层层查找,相似GLIDE。查找这个过程需求TLB,基址来决议。
  • TLB理解为索引表即可, 也能够理解为缓存。查找地址的复杂度为O(1)
  • 假如索引没找到,经过基址 + offset查找,复杂度为O(n)
  • 假如还没找到,只能经过IO去硬盘找
  • 硬盘这部分空间,往往称为交流(swap)空间
  • 别的为了避免进程内存无限膨胀(比方),需求设置驻留集(Resident Set Size),下面临驻留集进行了介绍
  • 驻留集(Resident Set Size)
    • 给每个进程分配特定巨细的常驻空间
    • 驻留集分为可变驻留集和固定驻留集
    • 可变驻留集
      • 缺页率较高,需求改变
      • 比较复杂,要求操作体系评估活动进程行为,不过对于当前的操作体系来讲 基操勿6
      • 增加软件开支
      • 依赖硬件
    • 固定驻留集
  • 假如驻留集满了,需求将部分Page(这儿理解为内存)换到硬盘空间,如下图,page1被交流到硬盘空间了

Android内存分析

  • 当进程需求page1的时分,从硬盘空间交流到内存里。此刻硬盘空间和内存均有数据(注意硬盘中的page1大部分状况不会被整理)。假如就出现了缓存模型,会有缓存失效等问题。

Android内存分析

  • 当后续进程改动了page1,此刻这块内存就叫Dirty Page,假如想交流Dirty Page到硬盘,需求从头对硬盘地址进行IO。由于被修改了,映射联系会变
  • 反之没有被改动的内存称为**Clean page,**假如想抹掉clean page,直接抹掉clean page内存即可。而无需关怀硬盘地址。

dump内存剖析

执行命令 adb shell dumpsys meminfo [进程名], 能够得到如下信息

Applications Memory Usage (in Kilobytes):
Uptime: 2051700 Realtime: 2051700
** MEMINFO in pid 3049 [com.joyzhou.demo] **
                   Pss  Private  Private  SwapPss      Rss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty    Total     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------   ------
  Native Heap    19028    18676      276     1312    23092    28672    18478     5400
  Dalvik Heap    23190    22872      148        0    31176    29253     4677    24576
 Dalvik Other     3854     2680      272      372     6092                           
        Stack      984      816      168      500      996                           
       Ashmem       80        0        0        0      928                           
    Other dev       20        0       20        0      332                           
     .so mmap     1756      252      792        0    38040                           
    .jar mmap     1051        0        0        0    33092                           
    .apk mmap      542        0        4        0     1464                           
    .dex mmap     8749        0     8744    29240     9244                           
    .oat mmap       52        0        0        0     2740                           
    .art mmap     2832     2064      472     3668    16336                           
   Other mmap      195        8      140        0     1760                           
      Unknown      331      160      140      108     2128                           
        TOTAL    97864    47528    11176    35200   167420    57925    23155    29976
 App Summary
                       Pss(KB)                        Rss(KB)
                        ------                         ------
           Java Heap:    25408                          47512
         Native Heap:    18676                          23092
                Code:     9792                          86416
               Stack:      816                            996
            Graphics:        0                              0
       Private Other:     4012
              System:    39160
             Unknown:                                    9404
           TOTAL PSS:    97864            TOTAL RSS:   167420       TOTAL SWAP PSS:    35200
 Objects
               Views:        0         ViewRootImpl:        0
         AppContexts:        5           Activities:        0
              Assets:        8        AssetManagers:        0
       Local Binders:       23        Proxy Binders:       41
       Parcel memory:       13         Parcel count:       52
    Death Recipients:        6      OpenSSL Sockets:        0
            WebViews:        0
 SQL
         MEMORY_USED:      577
  PAGECACHE_OVERFLOW:      180          MALLOC_SIZE:       46
 DATABASES
      pgsz     dbsz   Lookaside(b)          cache  Dbname
         4       96             57     180/161/25  /data/user/0/com.pvr.pvrfit/no_backup/androidx.work.workdb
         4        8                         0/0/0    (attached) temp
         4       96             40         7/31/4  /data/user/0/com.pvr.pvrfit/no_backup/androidx.work.workdb (2)
         4       48             51         7/95/9  /data/user/0/com.pvr.pvrfit/databases/com_picovr_fit_database.db
         4       16                         0/0/0    (attached) temp
         4       48             82       222/32/5  /data/user/0/com.pvr.pvrfit/databases/com_picovr_fit_database.db (3)

下面解释几个比较难理解概念

  • PSS (Proportional Set Size): Proportional翻译为份额化的。实践使用的物理内存。平常使用一般看这个
    • SwapPss: 硬盘中的交流空间巨细
  • RSS (Resident Set Size): 驻留集巨细,android采用的是可变驻留集。这块有部分共享内存占用
  • Private Clean: 没有被更改的内存,踢出clean page,直接抹掉clean page内存即可。而无需关怀硬盘地址
  • Private Dirty:被更改的内存,踢出Dirty Page,需求从头对硬盘地址进行IO。由于被修改了,映射联系会变
  • Code: 代码的内存占用
  • Graphics: 表明图形相关内存占用
  • System: 表明体系相关的内存,这个部分每个体系逻辑策略不一样,比方ard10较小,ard12较大。

别的再Objects中能够发现一些内存走漏的相关信息,比方ViewRootImpl, Activities等