天天看点

强引用、软引用、弱引用、虚引用、引用队列

引用强度从高到低的顺序:强引用、软引用、弱引用、虚引用。

1、强引用

强引用就是我们平常最多使用的引用方式,比如  Student a = new Student();   Student b = a; 这两种形式都是强引用。

如果一个对象上有强引用,则垃圾回收器不会回收它,即便内存不足并抛出空间不足异常,也不会回收它。

要让垃圾回收器回收它的话,就令强引用 = null,比如 a = null,等同于让一个对象(假设对象只有一个强引用)没有了任何引用。

2、软引用 和 引用队列

SoftReference<Student>  sref = new SoftReference<>(new Student());  这种就是软引用,在堆里创建一个 student 对象,然后用一个软引用 sref 指向它。

如果一个对象上最高级别就是软引用的话,那在jvm 内存足够的情况下,不会回收它,在内存不足的情况下,会回收它。如果一旦回收了对象,那么该软引用的值是null(指向 null)。

软引用可以配合引用队列使用,当然也可以单独用。 

        ReferenceQueue<Student> refq = new ReferenceQueue<>();  创建一个引用队列;

        SoftReference<Student>  sref = new SoftReference<>(new Student(), refq); 

 如果软引用的对象没有被回收的话,那么软引用是不会被添加到引用队列中的,意味着队列为空。如果被回收了,软引用会被加入到队列中,我们可以定时地查看队列,了解软引用的那些对象是否被回收了(是否还活着)。

3、弱引用 和 引用队列

WeakReference<Student> wref = new WeakReference<>(new Student());  这种是弱引用,在堆里创建一个 student 对象,然后用一个弱引用 wref 指向它。

如果一个对象上最高级别就是弱引用的话,不管jvm内存是否足够,在垃圾回收时都要回收它。如果一旦回收了对象,那么该弱引用的值是null(指向 null)。

弱引用可以配合引用队列使用,当然也可以单独用。 

        ReferenceQueue<Student> refq = new ReferenceQueue<>();  创建一个引用队列;

        WeakReference<Student>  wref = new WeakReference<>(new Student(), refq); 

 如果弱引用的对象没有被回收的话,那么弱引用是不会被添加到引用队列中的,意味着队列为空。如果被回收了,弱引用会被加入到队列中,我们可以定时地查看队列,了解弱引用的那些对象是否被回收了(是否还活着)。

4、虚引用 和 引用队列

PhantomReference<Student> pref = new PhantomReference<>(new Student());  这种是虚引用,在堆里创建一个 student 对象,然后用一个虚引用 pref 指向它。没啥用,垃圾回收器在进行回收时,直接回收掉。

虚引用 和 弱引用 的区别:通过弱引用可以访问和操作对象、但是我们无法通过虚引用去访问和操作对象,虚引用仅仅起了一个标签作用一样。

虚引用必须配合引用队列使用。 因为你不配合的话,还创建虚引用干什么呢。 

        ReferenceQueue<Student> refq = new ReferenceQueue<>();  创建一个引用队列;

        PhantomReference<Student>  pref = new PhantomReference<>(new Student(), refq); 

 如果虚引用的对象将要被回收或者已经被回收,则会将虚引用添加到引用队列中。

虚引用主要用于监测某个对象被回收。