1.2.3 示例
1.1节已经介绍了出现内存泄漏时的问题及分析方法,在这里我们再以一个真实的例子介绍常见的几种内存问题和分析方法。
这是发生在手机管家4.x的某个版本上的案例,新版中加入了一些功能,开发人员估计新功能可能会分配几万字节到几十万字节的内存,因此我们来进行内存方面的测试验证。当新功能的代码合入后,我们发现应用启动后的内存增长超过了2MB,这可大大超出了所有人的预期,一定是有什么地方出了严重的问题。
由于新加入了好几个功能,因此要逐个去排查。如果某个新功能的代码都在同一个package下,那么就可以使用MAT的过滤功能来验证这部分代码是否使用了内存,如图1-7所示。
图1-7 使用MAT的过滤功能
经过一番筛选排查,发现内存中多出了一些新对象,多消耗了约300KB内存,目前这并不能解释内存增长了2MB的原因。但仔细检查多出来的对象并清理掉不用的部分也是有帮助的。
经过检查,这部分内存是其他新功能使用的。对此我们需要进一步确认,这些对象是否是有用的,还是临时创建的。对于临时创建不再使用的对象可以主动销毁,而对于保存着信息将要用到的对象也可以进行进行压缩裁剪,以进一步减少占用的内存。
在以上排查中,我们确实发现了一些问题,但将一些不用的对象清理后再执行测试,总体内存并没有明显减少。现在看来,Dalvik Heap里分配的内存并没有增加许多,说明问题是不能只在Dalivk Heap里就能解决的,也许是别的部分出现了问题?接下面我们就继续深挖下去。