Java引用

参考文献:https://www.cnblogs.com/huajiezh/p/5835618.html

重:

    其他:四种引用所对应的gc回收都是在可用的状态下,例如a的局部变量在b中就是不可用的,自然会被gc回收;

1、什么是引用?

    在java中指向对象的标识符称为用;

2、引用的分类?

    引用氛围四类:强引用、软引用、弱引用、虚引用/幻引用;

    (1) 强引用:如果一个对象具有强引用,它就不会被GC强制回收,即使当前内存空间不足也不会回收它,二是导致内存溢出抛出oom异常,使程序异常终止;

     例:String str = new String ("name") ; // str既是一个强引用;

     如何中断强引用与某个对象之间的关联?

             显示的将引用设置为null,这样JVM就会在合适的时间回收;

     (2)软引用:在使用软引用时,若空间足够,则软引用继续使用,若空间不足,则会被gc回收,且回收的机制是:对于长时间闲置的软可及对象进行回收,尽量保存刚刚创建的以及刚刚使用的软可及对象;可以和一个引用队列联合使用,如果软引用指向的非强可及对象被回收,JVM就会把这个软引用加入到与之关联的队列中;(引用队列在文章后面介绍)

    例:Object obj = new Object();       // obj 是一个强引用,指向这个Obejct对象

           SoftReference<Object> soft = new SoftReference<Object>(obj);// soft 就是一个软可及引用,指向Object这个对象,此时Object这个对象还是强引用对象,及内存不足时会抛出OOM异常(根据可及性判断,可及性判断在文章最后)

           obj = null ; // 结束强引用,将obj指向的对象变成软可及对象;

          System.gc(); // 手动调用gc回收

          Object ojb2 = soft.get();// 弱obj指向的对象被回收(内存不足),则返回为null,若内存足够,则返回soft指向的软可及对象;

    (3)弱引用:在JVM进行GC回收时,若发现弱引用,不论内存是否足够,都会将弱引用关联的对象回收(仅有弱引用指向的对象);可以和一个引用队列使用,如果弱引用指向的非强可及对象被回收,JVM就会把这个弱引用加入到与之关联的队列中;

      例:Object obj = new Object(); 

              WeakReference<Object> weak = new WeakReference<Object>(obj);

              obj = null;

              System.gc(); // 若调用gc则get方法得到的为null(及不论内存是否充足,只要gc回收都会回收仅有若引用指向的对象);

              Object obj2 = weak.get();

   (4)虚引用:与软、弱引用不同,并不影响对象的生命周期,如果一个对象仅背虚引用对象关联,那么他相当于没有引用,随时都会被gc回收;且虚引用必须与引用队列关联使用,当gc回收对象时,发现其还有虚引用,就会将虚引用加入与之关联的队列中,程序中可以通过判断队列中是否加入了虚引用来判断是否回收被引用的对象;如果程序发现某个虚引用已经加入队列,可以在其回收之前做一些对应的操作;

         例:Object obj = new Object(); 

               PhantomReference<Object> weak = new PhantomReference<Object>(obj);

               obj = null;

               pr.get();

3、什么是引用队列?

        用来存放对象的引用的,防止由软引用、弱引用等导致的内存溢出,因为SoftReference的对象除了有保存软引的特性外,也具Java对象的特性,当其get方法返回为空时,此时SoftReference也就失去了意义,需要清除,防止由其带来的内存溢出;

       使用:

               ReferenceQueue rq = new ReferenceQueue();

               SoftReference<mObject> sr = new SoftReference<mObject>(mobj, rq);

               然后通过调用rq.poll();查看其返回值是否不为空,则清空对应的引用对象;

4、可及性判断?

      单条引用路径可及性判断:在单条路径中,最弱的一个引用决定对象的可及性;

      多条引用路径可及性判断:在多条路径中,最强的一个引用决定对象的可及性;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值