java四种引用及在四种引用及在LeakCanery中应用详解中应用详解
主要介绍了java四种引用及在LeakCanery中应用,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要
的朋友可以参考下
java 四种引用四种引用
Java4种引用的级别由高到低依次为:
StrongReference > SoftReference > WeakReference > PhantomReference
1. StrongReference
String tag = new String("T");
此处的 tag 引用就称之为强引用。而强引用有以下特征:
1. 强引用可以直接访问目标对象。
2. 强引用所指向的对象在任何时候都不会被系统回收。
3. 强引用可能导致内存泄漏。
我们要讨论的其它三种Reference较之于强引用而言都属于“弱引用”,也就是他们所引用的对象只要没有强引用,就会根据条
件被JVM的垃圾回收器所回收,它们被回收的时机以及用法各不相同。下面分别来进行讨论。
2. SoftReference
软引用有以下特征:
1. 软引用使用 get() 方法取得对象的强引用从而访问目标对象。
2. 软引用所指向的对象按照 JVM 的使用情况(Heap 内存是否临近阈值)来决定是否回收。
3. 软引用可以避免 Heap 内存不足所导致的异常。
当垃圾回收器决定对其回收时,会先清空它的 SoftReference,也就是说 SoftReference 的 get() 方法将会返回 null,然后再调
用对象的 finalize() 方法,并在下一轮 GC 中对其真正进行回收。
3. WeakReference
WeakReference 是弱于 SoftReference 的引用类型。弱引用的特性和基本与软引用相似,区别就在于弱引用所指向的对象只
要进行系统垃圾回收,不管内存使用情况如何,永远对其进行回收(get() 方法返回 null)。
弱引用有以下特征:弱引用有以下特征:
1. 弱引用使用 get() 方法取得对象的强引用从而访问目标对象。
2. 一旦系统内存回收,无论内存是否紧张,弱引用指向的对象都会被回收。
3. 弱引用也可以避免 Heap 内存不足所导致的异常。
4. PhantomReference(虚引用)
PhantomReference 是所有“弱引用”中最弱的引用类型。不同于软引用和弱引用,虚引用无法通过get()方法来取得目标对象的
强引用从而使用目标对象,观察源码可以发现 get() 被重写为永远返回 null。
虚引用有以下特征:虚引用有以下特征:
虚引用永远无法使用 get() 方法取得对象的强引用从而访问目标对象。
虚引用所指向的对象在被系统内存回收前,虚引用自身会被放入 ReferenceQueue 对象中从而跟踪对象垃圾回
收。
虚引用不会根据内存情况自动回收目标对象。
虚引用必须和引用队列(ReferenceQueue)联合使用
Reference与与ReferenceQueue 使用使用demo
定义一个对象Brain
public class Brain {
public int mIndex;
// 占用较多内存,当系统内存不足时,会自动进行回收
private byte []mem;
public Brain(int index) {
mIndex = index;
mem = new byte[1024 * 1024];