美文网首页
LeakCanary 解析收获

LeakCanary 解析收获

作者: heiheiwanne | 来源:发表于2017-08-31 19:44 被阅读18次

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

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

所以便有了:


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


F8A14433-982B-4A6C-AD86-FC4A84E7193F.png

这里是某些时机发送的handler


发送

7.注册Activity的事件:

注册事件方式

相关文章

  • LeakCanary 解析收获

    此文只做笔记使用,不做系统解析LeakCanary有关于LeakCanary的原理部分: 1.APP每次启动都会单...

  • LeakCanary源码解析

    LeakCanary源码解析 前言 对于内存泄漏的检测,基于MAT起点较高,所以一般我们都使用LeakCanary...

  • LeakCanary解析

    LeakCanary LeakCanary是Square公司开源的检测内存泄露的工具, 如果怀疑自己或者队友写的代...

  • LeakCanary解析

    github地址:LeakCanary 使用很简单In your build.gradle In your App...

  • LeakCanary源码解析

    LeakCanary源码解析 内存泄露 今天来讲解一下老生常谈的问题了,内存泄露以及讲解LeakCanary是如果...

  • LeakCanary 源码解析

    一、 前言 1. Java 内存模型 2. Java垃圾回收策略 引用计数算法:给对象中添加一个引用计数器,每当有...

  • LeakCanary 源码解析

    LeakCanary 是由 Square 开源的针对 Android 和 Java 的内存泄漏检测工具。 使用 L...

  • LeakCanary基本解析

    大家知道Android系统对app的内存有一个上限,如果代码风格不好,业务庞大,时间紧没有代码评审来约束,是很容易...

  • LeakCanary相关解析

    Android开发中经常会出现OOM的情况,使用LeakCanary可以对于OOM进行检测与分析,那么这一篇就通过...

  • LeakCanary源码解析

    LeakCanary 一个内存泄漏检测库,适用于Android和Java环境 “A small leak will...

网友评论

      本文标题:LeakCanary 解析收获

      本文链接:https://www.haomeiwen.com/subject/lgccjxtx.html