Java中的四种引用类型及其说明

107 阅读2分钟

1.强引用类型

这种类型指的是平时使用时直接用new的方式获得的对象,并有一个指针对其引用。在这种情况下,只要这个引用不断,不主动中断。这个对象永远也不会被回收。

public class LL {
    public static void main(String[] args) {
        LL ll = new LL();
        ll = null;
    }
}

这个引用其实可以抽象为一条引线,用这条引线牵引对象。在强引用中,只要这条引线存在,那么对象永远不会被回收。

2.软引用类型

这种类型指的也是一种引线,不过这种引线在内存不足的时候会被GC强制切断。不过这种引用类型不会在内存不够的时候直接就进行回收。GC会首先执行一次,回收一波垃圾。如果剩余的内存还是不够,才会回收这一部分软引用类型的对象。也就是这部分对象进行的是二次回收。

public class LL {
    public static void main(String[] args) {
        LL ll = new LL();
        SoftReference<LL> srf = new SoftReference<>(ll);
        ll = null;
    }
}

代码的第5行执行的目的是断开这条强引用的链条。仅仅保留弱引用的链条。

3.弱引用

同样,也可以认为是一条引线。不过这种引线更弱,只要JVM进行了垃圾回收。这条引线就会被断开。

public class LL {
    public static void main(String[] args) {
        LL ll = new LL();
        WeakReference<LL> wref = new WeakReference<>(ll);
        ll = null;
    }
}

4.虚引用

这个引线的作用更小,甚至通过这个引线拿不到对应的对象。看如下代码

public class LL {
    public static void main(String[] args) {
        LL ll = new LL();
        ReferenceQueue<LL> llqueue = new ReferenceQueue<>();
        PhantomReference<LL> llPhantomReference = new PhantomReference<LL>(ll,llqueue);
        System.out.println(llPhantomReference.get());
        ll = null;
    }
}

这玩意没啥实际意义。主要的用途就是这个对象被回收的时候,起到一个通知的作用。这个ReferenceQueue对象就是这个对象临近被销毁的时候所进入的队列。