urlname
type
Post
password
SyncToConfluence
category
Android
date
Feb 22, 2023 12:51
slug
c0f298f2077e
icon
Button
catalog
summary
tags
Android
性能优化
cover
Status
BusyTime
Status 1
status
Published

内存描述指标

主要用来度量一个 APP 的内存情况,更直观地展示出优化前后的效果
  • 主要有 6 个指标
    • PSS ( Proportional Set Size )
      • 实际使用的物理内存,会按比例分配共享的内存。
    • RSS( Resident Set Size )
      • PSS 中的共享库会按比例分担,但是 RSS 不会,它会完全算进当前进程,所以把所有进程的 RSS 加总后得出来的内存会比实际高。
    • Private Clean / Private Dirty
      • 当我们执行 dump meminfo 时会看到这个指标,Private 内存是只被当前进程独占的物理内存。独占的意思是即使释放之后也无法被其他进程使用,只有当这个进程销毁后其他进程才能使用。Clean 表示该对应的物理内存已经释放了,Dirty 表示对应的物理内存还在使用。
    • Swap Pss Dirty
      • 这个指标和上面的 Private 指标刚好相反,Swap 的内存被释放后,其他进程也可以继续使用,所以我们在 meminfo 中只看得到 Swap Pss Dirty,而看不到 Swap Pss Clean,因为 Swap Pss Clean 是没有意义的。
    • Heap Alloc
      • 通过 Malloc、mmap 等函数实际申请的虚拟内存,包括 Naitve 和虚拟机申请的内存。
    • Heap Free
      • 空闲的虚拟内存。

内存数据获取

主要用于获取在 内存中的数据
  • 主要有 2 种方式:
    • 线下通过 adb 命令获取:
      • 线上通过代码获取:
      • 以上两种方法,其原理都是一样的,都是调用的 android_os_Debug.cpp 对象中的 android_os_Debug_getDirtyPagesPid 接口

      内存模型详解

      具体展示 内存模型中各个部分的作用和含义
      notion image
      notion image

      A区域

      数据①:maps 文件数据

      通过 maps 文件我们可以详细知道这个进程的内存中存放了哪些数据。maps 文件存放在 /proc/{ pid }/maps 路径中,该路径除了存放该进程的 maps 文件,还存放了该进程的所有其他信息的数据。

      数据②:graphic 相关数据

      • Gfx dev
        • 绘制时分配,并且已经映射到应用进程虚拟内存中。
      • GL mtrack
        • 绘制时分配,没有映射到应用地址空间,包括纹理、顶点数据、shader program 等。
      • EGL mtrack
        • 应用的 Layer Surface,通过 gralloc 分配,没有映射到应用地址空间。不熟悉 Layer Surface 的话,可以将一个界面理解成一个 Layer Surface,Surface 存储了界面的数据,并交给 GPU 绘制。

      数据③:Alloc 内存

      该区域内存数据,是调用 malloc、mmap、calloc 等内存申请函数时积累的数据
      • 可以通过以下的方法获取该区域的数据:
        • 获取 Java 层申请的内存:会直接去 Art 虚拟机中获取虚拟机已经申请的内存大小。
          • 获取 Native 申请的内存:会调用 android_os_Debug.cpp 对象中的 android_os_Debug_getNativeHeapSize 接口获取数据,该接口又是调用的 mallinfo 函数,mallinfo 函数会返回 native 层已经申请的内存大小。

          B区域

          Java Heap

          (Dalvik Heap 的 Private Dirty 数据) + ( .art mmap 部分的 Private Dirty 和 Private Clean 数据) + getOtherPrivate ( OTHER_ART ) 。这里的 .art 是应用的 dex 文件预编译后的 art 文件,所以也是属于该应用的 JavaHeap。

          Native Heap

          Native Heap 的 Private Dirty 数据

          Code

          .so .jar .apk .ttf .dex .oat 等资源加总

          Stack

          getOtherPrivateDirty ( OTHER_STACK )

          Graphics

          gl,gfx,egl 的数据加总

          System

          ( Total Pss ) - ( Private Dirty 和 Private Clean 的总和)。主要是系统占用的内存,如共享的字体、图像资源等
           
          物理内存 JavaHeapLeetcode_剑指Offer_II_070-排序数组中只出现一次的数字
          Loading...