1.3 新问题的进一步挖掘
上一节介绍了内存测试的基本流程,讲述了如何发现并处理简单的内存问题。对于Dalvik Heap部分总结出了一些常见的问题模式,以及如何使用工具识别和处理这些常见的内存问题。
当简单问题不再是问题的时候,我们就会开始遇上一些奇怪问题了,类似于下面这些:
“我们这个版本引入了一个挺简单的库,内存就涨了2MB。”
“这些代码只是初始化了几个对象,还没有开始用呢。”
“我只是改了一行代码,没有创建新对象。”
“我一行代码都没改,怎么会涨呢?”
这次出现的问题就是这样一类问题,新版本的Dalvik Heap Pss内存出现了2MB左右的增长,但Dalvik Heap Alloc只增长了273KB,而从Dalvik Heap Free也能看出大部分增长的内存是处于空闲状态的。
对问题经过一段时间的观察,我们有以下几点发现:
经过较长时间待机后也没有被释放回系统。
有几处代码会导致内存增长,只要将这些代码屏蔽掉,内存使用情况就下降到正常水平。
这些代码分配的内存并不多,甚至有些地方是不需要分配内存的。
有些代码并不是这个版本新加入的,已经存在较长时间了。
使用裁剪功能的方法编译并分析内存后,基本可以确定是新加入代码消耗了内存,但并没有内存泄漏,代码经过审查也没有发现问题。
这个结果让我们陷入了困惑,常用的方法找不出问题,说明有更深层次的原因。接下来要从更底层的DVM虚拟机寻找问题。