核心代码如下
这段代码中涉及到了专为LeakCanary设计的Shark库的用法,在这里就不多解释了 。大概介绍一下每一步的作用:
- 首先调用HprofHeapGraph.indexHprof方法,这个方法会把dump出来的各种实例instance,Class类对象和Array对象等都建立起查询的索引,以record的id作为key,把需要的信息都存储在Map中便于后续取用
- 调用findLeakInput.findLeak方法,这个方法会从GC Root开始查询,找到最短的一条导致泄露的引用链,然后再根据这条引用链构建出LeakTrace 。
- 把查询出来的LeakTrace对外展示
本篇文章分析了LeakCanary检测内存泄露的思路和一些代码的设计思想,但是限于篇幅不能面面俱到 。接下来我们回答一下文章开头提出的问题 。
1.LeakCanary是如何使用ObjectWatcher 监控生命周期的?
LeakCanary使用了Application的ActivityLifecycleCallbacks和FragmentManager的FragmentLifecycleCallbacks方法进行Activity和Fragment的生命周期检测,当Activity和Fragment被回调onDestroy以后就会被ObjectWatcher生成KeyedReference来检测,然后借助HeapDumpTrigger的轮询和触发gc的操作找到弹出提醒的时机 。
2.LeakCanary如何dump和分析.hprof文件的?
使用Android平台自带的Debug.dumpHprofData方法获取到hprof文件,使用自建的Shark库进行解析,获取到LeakTrace
转载 https://mp.weixin.qq.com/s/plD0g16u0VEqVXDQJrhhpA
推荐阅读
- 11个促进Android应用开发的工具
- Tomcat配置HTTPS安全认证
- java对MongoDB数据库操作
- 新买的木床有味道是甲醛吗 几百块的木床会有甲醛吗
- 苹果电脑硬盘拓展的5种方法
- macOS Server:摇身一变,你的Mac就是一台强大的服务器
- 短裤拉链老是往下滑怎么办 裤子拉链为什么往下滑
- 2021年五一三倍工资是几天 2021五一几号是三倍工资
- 寒假是一个月还是两个月 寒假是1月到2月吗
- SEM干货:如何确定哪些是恶意点击?