LeakCanary原理,h5移动端开发方案

我们首先看isInAnalyzerProcess方法,看注释如果是LeakCanary进程就不允许初始化其他任务。这个进程是为LeakCanary分析堆内存用的。

LeakCanary原理,h5移动端开发方案_第1张图片

截屏2021-06-02 00.18.06.png 我们知道引入LeakCanary在你的项目编译成功之后会自动安装一个Leaks apk。看到上面LeakCanary.install(this)这行代码,是不是安装Leaks apk?是不是Leaks通过跨进程来检测我项目呢?检测原理又是怎样的?带着这些问题,接下来看看具体做了什么事情。会调用LeakCanary#install方法

LeakCanary原理,h5移动端开发方案_第2张图片 首先我们看看buildAndInstall方法具体做了什么事情

LeakCanary原理,h5移动端开发方案_第3张图片 看ActivityRefWatcher类名应该是Activity 引用监控,我们跟进这个installOnIcsPlus方法看看

LeakCanary原理,h5移动端开发方案_第4张图片 然后installOnIcsPlus方法又调用了ActivityRefWatcher#watchActivities方法,我们再跟进分析

LeakCanary原理,h5移动端开发方案_第5张图片 我们首先看看Application#registerActivityLifecycleCallbacks方法,我们知道原理registerActivityLifecycleCallbacks是注册Activity生命周期回调的方法。管理生命周期的方法,每个Activity都会回调到这里。我们看lifecycleCallbacks这个变量对应着Activity的生命周期。 到这里所以我们是不是可以猜想到LeakCanary其实就是通过注册Activity生命周期回调来监控检查是否有内存泄露的。当Activity界面关闭回调用对应的onActivityDestroyed方法。 接下来我们看看Application.ActivityLifecycleCallbacks#onActivityDestroyed方法干了些什么事情。

截屏2021-06-02 00.20.08.png

LeakCanary原理,h5移动端开发方案_第6张图片 接下来会调用到com.squareup.leakcanary.RefWatcher#watch(java.lang.Object)方法。

LeakCanary原理,h5移动端开发方案_第7张图片 将其Activity引用包装成一个KeyedWeakReference弱引用。被WeakReference包装的引用如果被回收会添加到ReferenceQueue队列中,WeakReference和ReferenceQueue将在接下来的文章里分析。WeakReference和ReferenceQueue 通过检查ReferenceQueue里的Activity引用来检测是否能够被回收。下面具体看看检测方法:

LeakCanary原理,h5移动端开发方案_第8张图片 通过ensureGone这个方法名可以看出应该是确保引用释放的意思。具体看看ensureGone方法做了些什么:

我们主要看removeWeaklyReachableReferences(),gcTrigger.runGc(),heapdumpListener.analyze()这三个方法。

1.通过removeWeaklyReachableReferences移除所有ReferenceQueue队列的WeakReference对象的Activity引用。如果可以回收就直接返回。
最后,如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击我的GitHub免费领取~

这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~

oid 学习,面试文档,视频收集大整理**,有兴趣的伙伴们可以看看~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

你可能感兴趣的:(程序员,架构,面试)