移动App性能评测与优化
上QQ阅读APP看书,第一时间看更新

1.2.4 新的问题

经过上一轮的优化,在内存监视器里新版本的Heap内存表现已经比较好了,新功能只消耗了几万字节到几十万字节内存。但是要注意的是,Heap内存并不是应用的全部,我们在设置或其他管理工具里看到的应用内存大小是应用整个进程的内存使用量。也有可能出现Heap部分完全没有增长而其他部分增长的情况。

要观察进程的内存使用情况,就需要用到其他的观测工具,Android里最常用于观察进程内存的方法就是dumpsys meminfo <package name/pid>命令。

对我们的新版应用执行该命令,能够得到以下的输出结果:

        ** MEMINFO in pid 17481 [com.example] **
                                  Shared   Private      Heap      Heap      Heap
                            Pss     Dirty     Dirty      Size     Alloc      Free
                        ------    ------    ------    ------    ------    ------
                Native         28          8         28      5744      3739      1117
          Dalvik Heap     10112     10224      9624     14076     10386      3690
          Dalvik Other      3212      3076          0          0
                 Stack        270        270          0          0
                Ashmem          2          0          0          0
             Other dev          7          0          4          0
              .so mmap       1867       1330        160          0
             .jar mmap          4          0          4          0
             .apk mmap      2944           0       2690          0
             .dex mmap      4110          64       3420          0
            Other mmap         16          4          4          0
               Unknown       2351       2331          0          0
                 TOTAL      24895      12404       6212          0

在以上输出结果中,左边Pss列的数据标识进程各部分对真实物理内存的消耗,左下角的TOTAL值就是我们在各种管理工具里看到的应用内存消耗。

而Android Studio等工具里显示的内存值,在这里是Dalvik Heap Alloc部分。根据以上的数据,我们可以看到Dalvik Heap和Heap Alloc不是相等的,而且除了Dalvik Heap之外,还有其他很多部分也会消耗内存。

这时候我们再对比一下旧版,看看是否也如此:

        ** MEMINFO in pid 14233 [com.example] **
                                  Shared   Private      Heap      Heap      Heap
                            Pss     Dirty     Dirty      Size     Alloc      Free
                        ------    ------    ------    ------    ------    ------
                Native         28          8         28      5664      3767      1040
          Dalvik Heap      8026     10372      7508     11784     10113      1671
          Dalvik Other     3159      3076          0          0
                Stack        260        260          0          0
                Ashmem          2          0          0          0
             Other dev          7          0          4          0
               .so mmap      1887       1344        160          0
             .jar mmap          4          0          4          0
              .apk mmap      2941          0       2680          0
              .dex mmap      4013         64       3360          0
            Other mmap         16          4          4          0
                Unknown      2256      2244           0          0
                  TOTAL     22599     17372       13716          0

这时候就会发现问题了,Heap Alloc没增加多少,但Dalvik Heap Pss增加了许多。而其他部分基本保持不变或有少量增长。可见问题还是出现在Dalvik Heap部分,但只靠检查分配的对象是看不出来问题的。

Java代码的内存分配和释放都是由虚拟机管理的,那么这个问题会是虚拟机的问题吗?我们接下来继续通过虚拟机部分机制来探索这些内存增长的原因。