LeakCanary

301 阅读1分钟

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值相同,返回这个泄漏的对象。

参考