LeakCanary 源码学习二:LeakCanary,sw 实战营文件下载
LeakCanary 原理
============
1、Activity Destroy 之后将它放在一个 WeakReference
2、这个 WeakReference 关联到一个 ReferenceQueue
3、查看 ReferenceQueue 是否存在 Activity 的引用
4、如果该 Activity 泄露了,Dump 出 heap 信息,然后再去分析泄漏路径。
四种引用类型
======
参考文章:Android 四种引用比较与源码分析
1、强引用(StrongReference)
1.1 关于强引用引用的场景
直接 new 出来的对象
String str = new String(“yc”);
1.2 强引用介绍
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
通过引用,可以对堆中的对象进行操作。在某个函数中,当创建了一个对象,该对象被分配在堆中,通过这个对象的引用才能对这个对象进行操作。
1.3 强引用的特点
强引用可以直接访问目标对象。
强引用所指向的对象在任何时候都不会被系统回收。JVM 宁愿抛出 OOM 异常,也不会回收强引用所指向的对象。
强引用可能导致内存泄露。
1.4 注意相互引用情况
2、软引用(SoftReference)
2.1 关于 SoftReference 软引用
SoftReference:软引用–>当虚拟机内存不足时,将会回收它指向的对象;需要获取对象时,可以调用 get 方法。
可以通过 java.lang.ref.SoftReference 使用软引用。一个持有软引用的对象,不会被 JVM 很快回收,JVM 会根据当前堆的使用情况来判断何时回收。当堆的使用率临近阈值时,才会回收软引用的对象。
2.2 软引用应用场景
例如从网络上获取图片,然后将获取的图片显示的同时,通过软引用缓存起来。当下次再去网络上获取图片时,首先会检查要获取的图片缓存中是否存在,若存在,直接取出来,不需要再去网络上获取。
2.3 软引用的简单使用
用法如下
评论