<b>1.2.4 新的问题</b>
经过上一轮的优化,在内存监视器里新版本的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
.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代码的内存分配和释放都是由虚拟机管理的,那么这个问题会是虚拟机的问题吗?我们接下来继续通过虚拟机部分机制来探索这些内存增长的原因。