Java对象引用支持4种级别,从高到低分别是:强引用、软引用、弱引用和虚引用,用于控制灵活的控制对象的生命周期。

一、强引用

强引用就是我们平时创建的对象实例,JVM执行垃圾回收时,只要对象实例的引用还在,在内存不足时宁愿抛出OOM也不会对它进行回收。

private static void testStrongReference() {
    Object obj = new Object();

    System.gc();

    System.out.println(obj);  // 对象还在
}

二、软引用

软引用通过SoftReference对象进行创建,并传入被引用的对象,当被引用对象为null时,JVM在执行垃圾回收时,只有内存不足时才会对软引用进行回收, 软引用通常用于缓存数据。

private static void testSoftReference() {
    Object obj = new Object();

    SoftReference sr = new SoftReference(obj);

    obj = null;

    System.gc();

    System.out.println(sr.get());  // 内存足够时,对象还在
}

三、弱引用

WeakReference弱引用相对软引用是弱引用的对象生命周期更短暂,JVM执行垃圾回收时,无论内存是否不足,都会回收弱引用对象,弱引用通常也是用于缓存数据。

private static void testWeakReference() {
    Object obj = new Object();

    WeakReference wr = new WeakReference(obj);

    obj = null;

    System.gc();

    System.out.println(wr.get()); // 对象不在了
}

四、虚引用

PhantomReference虚引用是虚无缥缈的引用,通过虚引用获取的对象永远都为空,虚引用的作用主要用于监听垃圾回收,JVM执行垃圾收回前会把虚引用放入到引用队列ReferenceQueue中,可以通过监听ReferenceQueue来了解引用的对象是否被JVM回收,以及释放资源等。

private static void testPhantomReference() throws Exception {
    Object obj = new Object();

    ReferenceQueue<Object> rq = new ReferenceQueue();

    PhantomReference<Object> pr = new PhantomReference(obj, rq);

    System.out.println("--------垃圾回收前-------");
    System.out.println(pr.get()); // 对象无论什么时候获取,都不在
    System.out.println(rq.poll());

    obj = null;
    System.out.println("--------垃圾回收后-------");
    System.gc();
    Thread.sleep(500);
    System.out.println(pr.get());
    System.out.println(rq.poll()); // 可以看到对象信息
}

五、小结

引用类型 引用对象生存周期 应用场景
强引用 不会被回收 通常的对象创建
软引用 内存不足时回收 数据缓存
弱引用 执行垃圾回收时回收 数据缓存
虚引用 一直不存在 监听垃圾回收、释放资源
打赏
支付宝 微信
上一篇 下一篇