Android内存分析

android内存分析

本文主要介绍

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

前置知识

操作系统的内存管理

  • 一个进程的实际数据存在RAM(内存)和ROM(存储空间)。之所以需要再ROM里存储是因为RAM是稀缺资源。
  • 为了安全考虑,面向用户的往往是虚拟地址,从虚拟地址查找实际物理地址,需要层层查找,类似GLIDE。查找这个过程需要TLB,基址来决定。
  • TLB理解为索引表即可, 也可以理解为缓存。查找地址的复杂度为O(1)
  • 如果索引没找到,通过基址 + offset查找,复杂度为O(n)
  • 如果还没找到,只能通过IO去硬盘找
  • 硬盘这部分空间,往往称为交换(swap)空间
  • 另外为了防止进程内存无限膨胀(比如),需要设置驻留集(Resident Set Size),下面对驻留集进行了介绍
  • 驻留集(Resident Set Size)
    • 给每个进程分配特定大小的常驻空间
    • 驻留集分为可变驻留集和固定驻留集
    • 可变驻留集
      • 缺页率较高,需要变化
      • 比较复杂,要求操作系统评估活动进程行为,不过对于当前的操作系统来讲 基操勿6
      • 增加软件开销
      • 依赖硬件
    • 固定驻留集
  • 如果驻留集满了,需要将部分Page(这里理解为内存)换到硬盘空间,如下图,page1被交换到硬盘空间了
  • 当进程需要page1的时候,从硬盘空间交换到内存里。此时硬盘空间和内存均有数据(注意硬盘中的page1大部分情况不会被清理)。如果就出现了缓存模型,会有缓存失效等问题。
  • 当后续进程改动了page1,此时这块内存就叫Dirty Page,如果想交换Dirty Page到硬盘,需要重新对硬盘地址进行IO。因为被修改了,映射关系会变
  • 反之没有被改动的内存称为**Clean page,**如果想抹掉clean page,直接抹掉clean page内存即可。而无需关心硬盘地址。

dump内存分析

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

kotlin 复制代码
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等

相关推荐
JasonYin~1 小时前
HarmonyOS NEXT 实战之元服务:静态案例效果---手机查看电量
android·华为·harmonyos
zhangphil2 小时前
Android adb查看某个进程的总线程数
android·adb
抛空2 小时前
Android14 - SystemServer进程的启动与工作流程分析
android
Amd7944 小时前
在不同操作系统上安装 PostgreSQL
linux·windows·macos·postgresql·操作系统·数据库管理·安装指南
Gerry_Liang4 小时前
记一次 Android 高内存排查
android·性能优化·内存泄露·mat
天天打码5 小时前
ThinkPHP项目如何关闭runtime下Log日志文件记录
android·java·javascript
爱数学的程序猿8 小时前
Python入门:6.深入解析Python中的序列
android·服务器·python
brhhh_sehe8 小时前
重生之我在异世界学编程之C语言:深入文件操作篇(下)
android·c语言·网络
zhangphil8 小时前
Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆形图实现,Kotlin(2)
android·kotlin
Calvin8808289 小时前
Android Studio 的革命性更新:Project Quartz 和 Gemini,开启 AI 开发新时代!
android·人工智能·android studio