Java的四大引用

从JDK1.2开始,Java引用被分为四类,为了好记,这里从对内存的敏感程度由低到高分为“虚 弱 软 强”。那么什么是四大引用呢?

一.强引用

强引用是我们平时使用的对象,它是使用最多的的引用。它的特点如下:

  • 如果一个对象是强引用,并且该强引用还和GC ROOT相连接,那么垃圾回收器不会回收该对象,哪怕是内存不足,宁可抛出OutOfMemoryError异常;

上图里,Obj1和Obj2是不可被回收的强引用,Obj3和Obj4是可以被回收的强引用。

  • 强引用什么时候回收,可以手动设置obj=null,或者,等待该强引用和GC ROOT断开连接,等下次GC后的某时间,强引用会被回收。

举几个强引用的例子

Integer data = new Integer(12);
String str = "10086";
Student student = new Student();

二.软引用

当一个对象具有软引用的属性后,它就具有如下特点:

  • 只要内存足够,我们不回收它;
  • 当内存不足的时候,GC会回收它;
  • JVM会优先回收长时间闲置不用的软引用的对象,对那些刚刚构建的或刚刚使用过的“新”软引用对象会尽可能保留;
  • 如果回收完还没有足够的内存,才会抛出内存溢出异常。

软引用的应用场景:由于软引用对内存的敏感性,它可以用来高速缓存。

软引用代码

/**
 * @author 拾万个为什么
 * @date 2021/3/24
 * @since JDK1.8
 */
public class SoftReferenceDemo {

    public static void main(String[] args) {
        //强引用s
        String s = "拾万个为什么";
        //软引用softReference
        SoftReference<String> softReference = new SoftReference<String>(s);
        //获取软引用的对象
        String po = softReference.get();
        //打印软引用
        System.out.println(po);
        //强引用没有了,这时只有软引用指向"拾万个为什么"
        s = null;
        //强制回收
        System.gc();
        //看看有没有被回收
        po = softReference.get();
        //打印软引用
        System.out.println(po);

    }
}

打印台打印

三.弱引用

弱引用就是GC发现后马上回收的内存对象,不管它系统内存够不够。和秋蝉不能过冬一样,弱引用只能生存到下次GC前。

/**
 * @author 拾万个为什么
 * @date 2021/3/24
 * @since JDK1.8
 */
public class SoftReferenceDemo {

    public static void main(String[] args) {
        //强引用s
        String s = "拾万个为什么";
        //弱引用weak
        WeakReference<String> weak = new WeakReference<String>(s);
        System.out.println(weak.get());
    }
}

四.虚引用

和其他三种引用不同的是,虚引用和没有任何引用一样,在任何时候都会被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

Object object = new Object();
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue); 
posted on 2021-03-24 15:36  拾万个为什么  阅读(333)  评论(0编辑  收藏  举报