ActivityThead.mNewActivities导致的内存泄漏

昨天有测试报告说这个版本的应用在重复跑测试case的时候内存不断变大

由于测试case会重复启动activity首先就怀疑是不是activitty导致的内存泄漏

Adb shell dumpsys meminfo [packagename]

通过dump 信息,发现activity的实例确实在不断变多,但查阅代码并未发现任何持有引用的地方

android studio profile来 dump内存信息发现最短的引用路径来自android os. ActivityThead

开始有点不信,不觉得系统的引用的会导致内存不断增加,然后再次使用MAT分析

发现确实来自ActivityThead.mNewActivities

源码分析

通关简单分析发现mNewActivities 是一个链表

搜索关键字发现仅仅只在ActivityThead.Idler这个私有类里进行了引用释放,这个

MessageQueue.IdleHandler 这是一个接口,查阅注释发现这个接口仅仅只有当前线程 MessageQueue 空闲之后才会回调

这个类仅仅在handleResumeActivity 进行了实例化,然后放到了主线程的 MessageQueue ,而mNewActivities也是在这里添加的

IdleHandler 回调的地方

android.os.MessageQueue:

结论

通过以上分析已经很明显了,可以知道原因是主线程一直处于繁忙状态导致这个IdleHandler 无法回调,所以我立刻怀疑是否是由于有动画在不停的占用主线程的消息队列,把后台不必要的动画删掉后,问题解决