问题
这几天在学习Android相关的专项测试,顺手拿了我们Android的应用来学习。结果发现了一个很诡异的问题,在运行应用后,不做任何的操作,结果通过AS发现应用的内存会不停的上涨接着被GC掉。内存情况如下:
当然我们还可以看看LogCat的相关信息:
系统每隔10秒的时候就会GC一次。这个是个很严重的问题了。
分析
那么下来我们再来尝试分析下GC的原因是什么。首先我们得了解下GC被触发的原因都有哪些:
GC_CONCURRENT: 当我们应用程序的堆内存快要满的时候,系统会自动触发GC操作来释放内存。
GC_FOR_MALLOC: 当我们的应用程序需要分配更多内存,可是现有内存已经不足的时候,系统会进行GC操作来释放内存。
GC_HPROF_DUMP_HEAP: 当生成HPROF文件的时候,系统会进行GC操作
GC_EXPLICIT: 主动通知系统去进行GC操作,比如调用System.gc()方法来通知系统。或者在DDMS中,通过工具按钮也是可以显式地告诉系统进行GC操作的。
从前面的截图我们就知道,应用被GC的原因是因为应用程序的堆内存快满了,所以系统自动触发GC的操作。
下来我们使用Allocation Tracker 进行初步的分析
点击Start Allocation Tracking 等待一段时间后,再次点击。我们看看生成的 alloc文件
alloc文件可以查看到这一段时间内,内存的情况,我们从上图可以看到产生内存最大的就是TouchEvent以及ReadWideTouchData 方法了。当然如果有源码我们还可以直接右键进入相应的源码进行查看。
结论
经过以上的分析,初步怀疑是因为应用运行以后,会不停的去读取touchEvent事件,并且就算没有数据读到时,也会new出一个TouchData的对象。所以就会导致系统不停的GC