1.3 新问题的进一步挖掘

上一节介绍了内存测试的基本流程,讲述了如何发现并处理简单的内存问题。对于Dalvik Heap部分总结出了一些常见的问题模式,以及如何使用工具识别和处理这些常见的内存问题。

当简单问题不再是问题的时候,我们就会开始遇上一些奇怪问题了,类似于下面这些:


“我们这个版本引入了一个挺简单的库,内存就涨了2MB。”

“这些代码只是初始化了几个对象,还没有开始用呢。”

“我只是改了一行代码,没有创建新对象。”

“我一行代码都没改,怎么会涨呢?”


这次出现的问题就是这样一类问题,新版本的Dalvik Heap Pss内存出现了2MB左右的增长,但Dalvik Heap Alloc只增长了273KB,而从Dalvik Heap Free也能看出大部分增长的内存是处于空闲状态的。

对问题经过一段时间的观察,我们有以下几点发现:

·经过较长时间待机后也没有被释放回系统。

·有几处代码会导致内存增长,只要将这些代码屏蔽掉,内存使用情况就下降到正常水平。

·这些代码分配的内存并不多,甚至有些地方是不需要分配内存的。

·有些代码并不是这个版本新加入的,已经存在较长时间了。

·使用裁剪功能的方法编译并分析内存后,基本可以确定是新加入代码消耗了内存,但并没有内存泄漏,代码经过审查也没有发现问题。

这个结果让我们陷入了困惑,常用的方法找不出问题,说明有更深层次的原因。接下来要从更底层的DVM虚拟机寻找问题。