引用强度从高到低的顺序:强引用、软引用、弱引用、虚引用。
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);
如果虚引用的对象将要被回收或者已经被回收,则会将虚引用添加到引用队列中。
虚引用主要用于监测某个对象被回收。