LeakCanary 内存检测原理

LeakCanary  排查内存泄露原理
通过registerActivityLifecycleCallbacks监听activity生命周期,当activity执行onDestroy方法时,
证明当前activity会被回收。activityRefWatcher类则在registerActivityLifecycleCallbacks的
onActivityOnDestroy方法里,把当前activity放在KeyedWeakReference(WeakReference的子类)
中,通过查询ReferenceQueue,看该activity是否存在,存在则证明可以正常回收,不存在则证明
可能存在内存泄露。

ReferenceQueue的作用
ReferenceQueue是这样的一个对象,当obj被gc释放后,其相应的包装类,即ref对象会被放入
queue中,我们可以从queue获取到相应的对象信息,同时进行额外的处理。

LeakCanary源码实现 
当使用LeakCanary时,只需要调用LeakCanary.install(this);即可。

首先执行removeWeaklyReachableReferences(),从ReferenceQueue队列中查询是否存在该弱引用对象,
如果不为空,则说明已经被系统回收了,则将对应的随机数key从retainedKeys集合中删除。

判断retainedKeys集合中是否存在对应的key判断该对象是否被回收。如果没有被系统回收,
则手动调用gcTrigger.runGc();后再调用removeWeaklyReachableReferences方法判断该对象是否被回收。

 关注哈公众号,技术交流…

LeakCanary 内存检测原理_第1张图片

 

你可能感兴趣的:(ANDROID)