Java 中的强、软、弱、虚引用生命周期对比

这个是一个概念的摘要,在帮助初学者能快速理解四者之间的差异方面还是比较有帮助

引用类型示例代码生命周期应用场景
强引用Object o = new Object();只要还有强引用指向一个对象,垃圾收集器就不会回收这个对象。
在不用对象时将引用置为
null,帮助GC回收对象
最常应用场景
软引用Browser prev = new Browser();  // 获取页面进行浏览
SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用
if(sr.get()!=null) {
rev = (Browser) sr.get();  //
还没有被回收器回收,直接获取
} else {
prev = new Browser(); //
由于内存吃紧,所以对软引用的对象回收了
sr = new SoftReference(prev);   // 重新构建
}
一个对象只具有软引用,在内存足够时,垃圾回收器不会回收它;如果内存不足,就会回收这个对象的内存图片缓存、网页缓存
弱引用public class Main {
    public static void main(String[] args) {
        A a = new A();
        B b = new B(a);
        a = null;
        System.gc();
        System.out.println(b.getA());  // 返回NULL,因为A被回收
    }
}
class A {}
class B {

    WeakReference<A> weakReference;
    public B(A a) {
        weakReference = new WeakReference<>(a);
    }
    public A getA() {
        return weakReference.get();
    }
}
当垃圾回收器扫描到只具有弱引用的对象,不管当前内存空间是否足够,都会回收内存。在静态内部类中,经常会使。例如:一个类发送网络请求,承担 callback 的静态内部类,则常此引用的方式来保存外部类的引用,当外部类需要被 JVM 回收时,不会因为网络请求没有及时回应,引起内存泄漏。
虚引用Object obj = new Object();
ReferenceQueue refQueue = new ReferenceQueue();
PhantomReference<Object> phantomReference = new PhantomReference<Object>(obj,refQueue);
虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。通过判断引用队列就可以知道对象是否被回收,据此进行一些额外的资源释放工作或者其他处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值