性能优化系列 - 内存 - 001

1,426 阅读4分钟

文档

教程

零散的点

  1. PowerManager实例的创建,应该使用Application,不应该使用Activity.
  2. Toast使用的Context应该使用Application.
  3. Dialog,PopupWindow,在Activity销毁前,应该 dismiss + set null .

adb shell dumpsys meminfo 分析内存占用

adb shell dumpsys meminfo 包名/进程id

  • Pss Total 指占用了真实的物理内存的空间.一般用这个值表示APP实际内存占用.
  • Objects是统计App内部组件对象个数,其中Views、ViewRootImpl以及Activities个数,在Activity onDestroy后应该都会回收清零,如果onDestroy调用后这几个对象个数没有清零,就可能发生了内存泄漏。
  • android程序内存被分为2部分:native和dalvik,dalvik就是java堆,普通java对象是在java堆分配,而bitmap是直接在native上分配,对于内存的限制是 native+dalvik 不能超过最大限制。
  • Native Heap:Native代码分配的内存,虚拟机和Android框架分配内存。
  • Dalvik Heap:Java对象分配的占据内存
  • Dalvik Other:类数据结构和索引占据内存
  • Stack:栈内存
  • Ashmem:不以dalvik- 开头的内存区域,匿名共享内存用来提供共享内存通过分配一个多个进程可以共享的带名称的内存块。匿名共享内存(Anonymous Shared Memory-Ashmem。Android匿名共享内存是基于Linux共享内存的,都是在tmpfs文件系统上新建文件,并将其映射到不同的进程空间,从而达到共享内存的目的,只是,Android在Linux的基础上进行了改造,并借助Binder+fd文件描述符实现了共享内存的传递。
  • Other dev:内部driver占用的内存
  • .so mmap: C库代码占用的内存
  • .jar mmap: java文件代码占用的内存
  • .apk mmap: apk代码占用的内存
  • .ttf mmap: ttf文件代码占用的内存
  • .dex mmap: dex文件代码占用内存。类函数的代码和常量占用的内存,dex mmap是映射classex.dex文件,Dalvik虚拟机从dex文件加载类信息和字符串常量等。Dex文件有索引区和Data区
  • Other mmap: 其它文件占用的内存
  • App Summary下:
    • Java Heap: java内存占用
    • Native Heap: native内存占用
    • Code: 代码段内存占用
    • Stack: 栈内存占用
    • Graphics: Graphics/GL内存占用
    • Private Other: 其他私有数据内存占用
    • System: 共享内存的PSS占用
                   Pss  Private  Private  SwapPss      Rss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty    Total     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------   ------
  Native Heap    24324    24288        0       36    25228    36056    26521     5482
  Dalvik Heap     6184     6080        0       34     6944    29386     4810    24576
 Dalvik Other     8625     3148        0        0    14532
        Stack     1596     1596        0        0     1604
       Ashmem        6        0        0        0       24
    Other dev       34        4       28        0      420
     .so mmap     9856      284     2852       41    60120
    .jar mmap     4458        0     1408        0    33012
    .apk mmap     1618        0      276        0    21048
    .ttf mmap       52        0        0        0      292
    .dex mmap    14180    14048       44        0    14440
    .oat mmap      128        0        0        0     2760
    .art mmap     9311     8748       28       50    18064
   Other mmap      851        4        0        0     5552
   EGL mtrack     6043     6043        0        0     6043
    GL mtrack    18592    18592        0        0    18592
      Unknown      548      516        0        4     1088
        TOTAL   106571    83351     4636      165   106571    65442    31331    30058

 App Summary
                       Pss(KB)                        Rss(KB)
                        ------                         ------
           Java Heap:    14856                          25008
         Native Heap:    24288                          25228
                Code:    18912                         142656
               Stack:     1596                           1604
            Graphics:    24635                          24635
       Private Other:     3700
              System:    18584
             Unknown:                                   10632

           TOTAL PSS:   106571            TOTAL RSS:   229763       TOTAL SWAP PSS:      165

 Objects
               Views:       17         ViewRootImpl:        1
         AppContexts:        6           Activities:        1
              Assets:       22        AssetManagers:        0
       Local Binders:     1137        Proxy Binders:       39
       Parcel memory:       14         Parcel count:       59
    Death Recipients:        0      OpenSSL Sockets:        0
            WebViews:        0