LeakCanary 解析收获

此文只做笔记使用,不做系统解析LeakCanary
有关于LeakCanary的原理部分:

1.APP每次启动都会单独启动一个进程(属性:process)service进行analyze ,Android 每启动一个进程都会调用Application的onCreate方法。

所以便有了:


LeakCanary 解析收获_第1张图片
3A7C3D42-98D4-4120-A225-E575375A7EFE.png

2.使用了weakRefrenceQueue
首先:Android 有两类引用类型:普通,refrence引用类型
refrence的子类有4种:StrongerRefrence 、softRefrence 、WeakRefrence 、 PhantomRefrence
PhantomRefrence:此类必须跟RefrenceQueue 一起使用

他们引用的对象有4种类型:

  • Active:创建之后的对象此类型
  • Pending: 等待入队列,已经被GC了(Refrence执行finilize之后,会被加入Pending-list)
  • Enqueued:有RefrenceQueue的入队列之后,处在队列中
  • Inactive: 出队列或者没有Queue被GC之后的状态,一旦变为此状态此对象便不可用(抛弃)

《Java源码分析》:ReferenceQueue、Reference及其子类

  1. WeakHashMap
    此hashmap使用的便是WeakRefrence跟Queue,检索没有被引用之后回收

4.在reference类加载的时候,java虚拟机会创建一个最大优先级的后台线程,这个线程的工作原理就是不断检测pending是否为null,如果不为null,就将其放入ReferenceQueue中,pending不为null的情况就是,引用所指向的对象已被GC,变为不可达。
那么只要我们在构造弱引用的时候指定了ReferenceQueue,每当弱引用所指向的对象被内存回收的时候,我们就可以在queue中找到这个引用。如果我们期望一个对象被回收,那如果在接下来的预期时间之后,我们发现它依然没有出现在ReferenceQueue中,那就可以判定它的内存泄露了。LeakCanary检测内存泄露的核心原理就在这里。

5.关闭组件其实并不难,只要创建packageManager对象和ComponentName对象,并调用packageManager对象的setComponentEnabledSetting方法。
public void setComponentEnabledSetting (ComponentName componentName, int newState, int flags)
componentName:组件名称 newState:组件新的状态,可以设置三个值,分别是如下: 不可用状态:COMPONENT_ENABLED_STATE_DISABLED 可用状态:COMPONENT_ENABLED_STATE_ENABLED 默认状态:COMPONENT_ENABLED_STATE_DEFAULT flags:行为标签,值可以是DONT_KILL_APP或者0。 0说明杀死包含该组件的app
public int getComponentEnabledSetting(ComponentName componentName)
获取组件的状态

  1. android addIdleHandler 空闲线程
    loop每次从MessageQueue取出一个Message,如果当前队列中没有任何消息的时,就去查找是否注册了IdleHandler的回调,如果有的话,则每个的执行,逻辑很简单。
Looper.myQueue().addIdleHandler(new IdleHandler()
     {
           @Override
            public boolean queueIdle() 
            {
                // TODO Auto-generated method stub
                //你想做的任何事情
             return false;   //为true时会一直循环调用此handler
            }
     });

ActivityThread 的GC便有idleHandler


LeakCanary 解析收获_第2张图片
F8A14433-982B-4A6C-AD86-FC4A84E7193F.png

这里是某些时机发送的handler


LeakCanary 解析收获_第3张图片
发送

7.注册Activity的事件:

LeakCanary 解析收获_第4张图片
注册事件方式

你可能感兴趣的:(LeakCanary 解析收获)