快捷搜索: 王者荣耀 脱发

Java中的四种引用类型

Java中的四种引用类型

Java中的变量有两种数据类型,分别是基本数据类型和引用数据类型,这篇文章就来讲一下Java中的引用类型。Java为引用类型专门定义了一个类叫做Reference。而引用类型Reference跟Java垃圾回收机制息息相关,所以我们有必要理解四种引用类型,才可以更加深入的理解Java的垃圾回收是怎么工作的。

一、强引用:

Java中默认的引用就是强引用,任何一个对象的赋值操作就产生了对这个对象的强引用。例如

Object o = new Object(); 
// 我们创建了一个Object对象,并复制给了o,这时o就是Object对象的一个强引用。

强引用的对象在发生GC时不会被回收。

二、软引用:

有用但不是必须的对象,发生GC时不一定会回收该对象,只有在内存不够用时才会被回收。软引用适合缓存使用的场景。下面看一下软引用对应的类SoftReference:

// 继承Reference抽象类
public class SoftReference<T> extends Reference<T> {
    // 有两个构造方法
    /**
     * @param referent 软引用的对象
     */
    public SoftReference(T referent) {
        super(referent);
        /*
           timestamp:记录每次调用get()方法获取软引用对象时的时间戳,虚拟机在清除
           软引用时可能会用到。
        */
        this.timestamp = clock; 
    }
    /**
     * @param referent 软引用的对象
     * @param ReferenceQueue 存储待回收的引用对象,也就是Reference的实例对象。
        软引用自身需要配合引用队列来释放。
     */
    public SoftReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
        this.timestamp = clock;
    }
}

例子:

SoftReference<Object> soft = new SoftReference<>(new Object());
// 当内存不足时Object对象就会被回收

三、 弱引用:

有用但不是必须的对象,在每次 GC 时都会被回收,这是和软引用的主要区别。下面看一下弱引用对应的类WeakReference:

// 同样继承Reference抽象类,构造方法也和SoftReference类似
public class WeakReference<T> extends Reference<T> {
    
    public WeakReference(T referent) {
        super(referent);
    }
    public WeakReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }
    
}

四、虚引用(幽灵引用/幻影引用):

无法通过虚引用获得对象,虚引用的用途是在GC时返回一个通知,即在GC的过程中,如果发现有PhantomReference,GC则会将引用放到ReferenceQueue中,程序员可通过ReferenceQueue知道发生了GC。下面看一下虚引用对应的类PhantomReference:

public class PhantomReference<T> extends Reference<T> {
        // 虚引用对象只有一个构造函数,必须传入ReferenceQueue
     public PhantomReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }
}
经验分享 程序员 微信小程序 职场和发展