java的四种引用类型

1.强引用:比如 Object obj = new Object(); //此时new Object拥有一个强引用obj
    System.gc();//触发垃圾回收,垃圾回收线程扫描到new Oject()这个对象存在 obj 这个强引用,则不会回收new Object;
    obj = null;//清除new Object的强引用obj
    System.gc();//触发垃圾回收,垃圾回收线程扫描到new Oject()这个对象已经不存在任何引用,回收new Object;

2.软引用:
解释:
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。使用场景比如数据查询缓存之类的,如果内存充足,则把之前查询的数据直接使用,否则再查一次。
举例:
    Object obj = new Object();
    ReferenceQueue refQueue = new ReferenceQueue();//引用队列,用来关联已经被注册的软引用或者弱引用或者虚引用,使用的结果就是当发生gc,如果对象被回收,那么其所关联的引用就会被放入队列里;这种队列可以用来检测对象回收的情况;
    SoftReference softRef = new SoftReference(obj, refQueue);//此时new Object()有两个引用,一个是obj强引用,一个是softRef软引用;软引用和弱引用可以使用引用队列,也可以不使用引用队列,不用的话直接写SoftReference softRef = new SoftReference(obj);
    System.out.println(softRef.get()); // java.lang.Object@f9f9d8,这里打印出new Object()的内存首地址。
    System.out.println(refQueue.poll());//检测引用队列是否有引用,这里因为还没有垃圾回收,所以打印出null;
    obj = null; //清除new Object的强引用,此时new Object只剩下softRef这个软引用
    System.gc();//触发垃圾回收,因为new Object只剩下softRef这个软引用,此时分情况,如果内存空间充足,则new Object不会被回收。否则被回收。
    Thread.sleep(200);//这里之所以要休眠是因为,如果new Object被回收,那么softRef就被放入ReferenceQueue这个引用队列中,放入是需要一定时间的。
    System.out.println(refQueue.poll());//refQueue.poll的作用是如果队列里存在引用,则把这个引用返回出来,并且从队列里remove掉。在内存不足的情况下,这里的结果就是把softRef返回出来,因为在前面一步new Object被回收掉,softRef被放入队列;如果内存空间充足,这里是null;
    System.out.println(softRef.get()); //new Object是否被回收,如果被回收,这里打印出null,否则打印new Object内存首地址。
    
3.弱引用:
同软引用一样,唯一的区别是,不管内存是否充足,只要发生gc,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。这里不再举例。弱引用相关的类是(WeakReference)

4.虚引用:

解释:虚引用和软引用、弱引用的区别是,它必须搭配ReferenceQueue引用队列使用。程序可以通过判断引用队列中是否已经加入了虚引用,来了解虚引用所引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

特别说明:
refQueue.poll()和refQueue.remove()
1、remove是一个阻塞方法,类似于J.U.C并发包下的阻塞队列,如果队列没有数据,那么当前线程一直等待。
2、如果队列有数据,那么remove和pool都会把第一个元素“弹”出队列。










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值