前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >强引用、软引用、弱引用、虚引用的对比

强引用、软引用、弱引用、虚引用的对比

作者头像
黑洞代码
发布2021-01-14 15:40:44
2.1K0
发布2021-01-14 15:40:44
举报

强引用、软引用、弱引用、虚引用

从Jdk1.2开始,在java.lang.ref包下就提供了三个类:SoftReference(软引用),PhantomReference(虚引用)和WeakReference(弱引用),它们分别代表了系统对对象的中的三种引用方式:软引用,虚引用以及弱引用。因此java语言对对象的引用有如下四种:

  1. 强引用:就是正常的引用。Object object = new Object(),object就是一个强引用,GC是不会清理一个强引用引用的对象的,即使面临内存溢出的情况。
  2. 软引用:SoftReference,GC会在内存不足的时候清理引用的对象。SoftReference reference = new SoftReference(object); object = null;
  3. 弱引用:GC线程会直接清理弱引用对象,不管内存是否够用。WeakReference reference = new WeakReference(object); object = null;
  4. 虚引用:和弱引用一样,会直接被GC清理,而且通过虚引用的get方法不会得到对象的引用。PhantomReference refernce = new PhantomReference(object); object = null;

1

强引用和软引用的区别

软引用只有在内存不足的时候才会被清理,而强引用什么时候都不会被清理(程序正常运行的情况下),即使是内存不足。利用软应用这一个特性,可以做一些缓存的工作。

2

软引用和弱引用的区别

弱引用不会影响GC的清理,也就是说当GC检测到一个对象存在弱引用也会直接标记为可清理对象,而软引用只有在内存告罄的时候才会被清理

3

弱引用和虚引用的区别

说两者的区别之前要说一下ReferenceQueue的概念,ReferenceQueue是一个队列,初始化Reference的时候可以作为构造函数的参数传进去,这样在该Reference的referent域(Reference用来保存引用对象的属性)指向的引用对象发生了可达性的变化时会将该Reference加入关联的队列中,这个具体的变化根据Reference的不同而不同。

弱引用和虚引用的区别就在于被加入队列的条件不同,这里主要侧重于考虑对象所属的类重写了finalize方法,将对象的状态归纳为三种:finalizable, finalized、reclaimed,分别代表:未执行finalize函数、已经执行finalize函数,已经回收。如果没有重写finalize函数的话下面再考虑。

虚引用必须和一个ReferenceQueue联合使用,当GC准备回收一个对象的时候,如果发现该对象还有一个虚引用,就会将这个虚引用加入到与之关联的队列

弱引用是当GC第一次试图回收该引用指向的对象时会执行该对象的finalize方法,然后将该引用加入队列中,但是该引用指向的对象是可以在finlize函数中“复活”的,所以即使通过Reference的get方法得到的是null,而且reference被加入到了ReferenceQueue,这个对象仍然可以存活的,这种现象是有点违背对象正常生命周期的。

代码语言:javascript
复制
public class TestWeakReference {
        private static ReferenceQueue<Object> rq = new ReferenceQueue<Object>();
        public static void main(String[] args) {
            Object obj = new Object();
            WeakReference<Object> wr = new WeakReference(obj,rq);
            System.out.println(wr.get()!=null);
            obj = null;
            System.gc();
            System.out.println(wr.get()!=null);//false,这是因为WeakReference被回收
        }


    }
运行结果为:true 、false
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 落叶飞翔的蜗牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档