LeakCanary
Leakcanary原理
- Activity Destroy之后将它放在一个Weakreference.
- 这个Weakreference关联到一个Referencequeue
- 查看ReferenceQueue是否存在Activity的引用。
- 如何该Activity泄漏了,Dump出heap信息,然后分析泄漏路径。
不足
- 无法检测出Service中的内存泄漏问题
- 如果最底层的MainActivity一直未走onDestroy生命周期(它在Activity栈的最底层),无法检测出它的调用栈的内存泄漏
ReferenceQueue
- 软引用/弱引用
- 对象被垃圾回收,java虚拟机就会把这个引用加入到与之关联的引用队列。
总结
- 首先会创建一个refwatcher,启动一个ActiivtyRefWatcher。
- 通过ActivityLifecycleCallbacks把Activity的onDestroy生命周期关联。
- 最后在线程池中开始分析我们的泄漏。
总结checkForLeak
- 把hprof转为Snapshot。
- 优化gcroots(去重)。
- 找出泄漏的对象/找出泄漏对象的最短路径。
总结findLeakingReference
- 在snapshot快照中找到第一个弱引用
- 遍历这个对象的所有实例
- 如果key值和最开始定义封装的key值相同,返回这个泄漏的对象。
参考