[源码]LeakCanary

内存泄露的实时监测,表示非常好奇,扫一眼。

原理

  • 查找泄露:对所有rootObj(这个是要外部用refWatcher.watch传入的)创建一个带queue的WeakReference。如果这个WR进了queue就肯定没有泄露,强制GC一次,如果WR没有进到queue就有可能有泄露
  • 确认泄露:使用Debug.dumpHprofData得到hprof文件,使用MAT解析成一个图。最后遍历图,找到内存泄露中存在的问题引用

合理设计

  • 所有依赖平台的部分都封装成interface,靠builder构建一个可运行实例
    • 文件
    • Executor
    • Debug信息(Debug影响内存泄露)
    • GC
    • HeapDumper
  • 尝试查找泄露都要保证queue是空闲的,如果不空闲用指数回退方法进行多次尝试

技巧

  • WeakReference构造函数可以传进一个ReferenceQueue,一旦WR被回收,都会放到这个queue里
  • MessageQueue可以通过addIdleHandler监听空闲
  • 给null一个合理的名字,增加可读性——HeapDumper.RETRY_LATER
  • System.gc不如Runtime.gc来的及时——GcTrigger.DEFAULT
  • 保证UI事件发生,可以在触发UI事件后,立刻在mainLooper的queue里addIdleHandler来监听——AndroidHeapDumper.dumpHeap
  • Debug.dumpHprofData可以输出出hprof文件——AndroidHeapDumper.dumpHeap
  • 善用工厂方法——AnalysisResult.failure
  • 找路径的算法其实蛮简单的,就是遍历一个图——ShortestPathFinder
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值