天天看点

移动App性能测评与优化1.2.4 新的问题

<b>1.2.4 新的问题</b>

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

要观察进程的内存使用情况,就需要用到其他的观测工具,android里最常用于观察进程内存的方法就是dumpsys meminfo &lt;package name|pid&gt;命令。

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

** 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       

    .apk mmap     2944       

0     2690        0

    .dex mmap     4110    

  64     3420       

   other mmap       16       

4        4        0

      unknown     2351    

2331        0        0

        total   

24895    12404     6212       

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

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

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

pid 14233 [com.example] **

                   pss   

dirty    dirty     size   

alloc     free

8       28     5664    

3767     1040

 dalvik heap    

8026    10372     7508   

11784    10113     1671

 dalvik other   

3159     3076        0       

        stack      260     

260        0        0

     .so mmap     1887    

1344      160        0

    .apk mmap     2941       

0     2680        0

    .dex mmap     4013      

64     3360        0

      unknown     2256    

2244        0        0

        total   

22599    17372    13716       

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

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

继续阅读