【Java】强引用,软引用,弱引用,虚引用是什么?

目录

强引用

软引用

弱引用

虚引用

今天聊聊这四个引用~

强引用

当new 一个对象的时候变量对这个对象的引用就是强引用,即在这个栈帧的范围内,这个对象不会被回收

public class Test {
    public static void main(String[] args) {
        Object o = new Object();
    }
}

图中就是一个强引用,只要这个main线程没有结束,这个对象就不会被垃圾回收。

软引用

当对象被SoftReference包装之后,对这个对象的引用为软引用,如下:

public class Test {
    public static void main(String[] args) {
        SoftReference<Object> soft = new SoftReference<>(new Object());
    }
}

当堆内存不足时,gc时会先将软引用的对象(即代码中new出来的Object对象)进行回收,如果堆内存还是不够用,老年代已经满了还有新的对象进入老年代时,才会发生OOM(内存溢出)。

如果要从soft中获取这个对象,可以使用soft.get()方法获取,当然当这个对象被回收之后,get方法返回为null

弱引用

当对象被WeakReference包装之后,对这个对象的引用为弱引用,如下:

public class Test {
    public static void main(String[] args) {
        WeakReference<Object> weakReference = new WeakReference<>(new Object());
    }
}

这个引用比软引用更弱,当创建完这个对象之后,如果遇到gc,这个对象就会被回收。所以这个对象的生命周期是被创建开始到遇到一次gc,存活时间相对于软引用更短,同样可以通过get方法获取对象

虚引用

当对象被PhantomReference包装之后,对这个对象的引用为虚引用,如下:

public class Test {
    public static void main(String[] args) {
        ReferenceQueue<Object> q = new ReferenceQueue();
        PhantomReference<Object> phantomReference = new PhantomReference<>(new Object(), q);
        System.out.println(phantomReference.get());
        // 主动建议触发一次gc
        System.gc();
        System.out.println(phantomReference.get());
        System.out.println(q.poll());
    }
}

虚引用要搭配Reference队列使用,无论在什么时候,通过phantomReference.get方法都无法获取到这个对象,发生一次gc后,这个对象会被放入队列中,此时q.poll的返回值为这个对象

开发入门中,欢迎指教~

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱好怪奇的奈斯

你是我更新的最大动力~么么哒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值