爱尚实训程序员吧 关注:22贴子:580

Java中的强引用和弱引用【爱尚实训】

取消只看楼主收藏回复



1楼2020-09-03 10:47回复
    何谓 Java 弱引用


    3楼2020-09-03 10:52
    回复
      【背景】
      国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和java的GC相关. 很可惜的是, 20多个拥有5年以上java开发经验的面试者中, 只有两人知道weak reference的存在, 而其中只有一人实际用到过他。


      4楼2020-09-03 10:53
      回复
        【分析】
        一个对象被回收, 必须满足两个条件:
        1.没有任何引用指向它
        2.GC被运行.
        在现实情况写代码的时候, 我们往往通过把所有指向某个对象的referece置空来保证这个对象在下次GC运行的时候被回收


        5楼2020-09-03 10:53
        回复
          强引用


          6楼2020-09-03 10:53
          回复
            手动置空对象对于程序员来说, 是一件繁琐且违背自动回收的理念的. 对于简单的情况, 手动置空是不需要程序员来做的, 因为在java中, 对于简单对象, 当调用它的方法执行完毕后, 指向它的引用会被从stack中popup, 所以他就能在下一次GC执行时被回收了.


            7楼2020-09-03 10:54
            回复
              但是, 也有特殊例外. 当使用cache的时候, 由于cache的对象正是程序运行需要的, 那么只要程序正在运行, cache中的引用就不会被GC给(或者说, cache中的reference拥有了和主程序一样的life cycle). 那么随着cache中的reference越来越多, GC无法回收的object也越来越多, 无法被自动回收. 当这些object需要被回收时, 回收这些object的任务只有交给程序编写者了. 然而这却违背了GC的本质(自动回收可以回收的objects).


              8楼2020-09-03 10:54
              回复
                强引用引发异常实例


                9楼2020-09-03 10:54
                回复


                  10楼2020-09-03 10:54
                  回复
                    弱引用
                    所以, java中引入了weak reference. 相对于前面举例中的strong reference:
                    Object c = new Car(); //只要c还指向car object, car object就不会被回收
                    当一个对象仅仅被weak reference指向, 而没有任何其他strong reference指向的时候, 如果GC运行, 那么这个对象就会被回收. weak reference的语法是:
                    WeakReference weakCar = new WeakReference(Car)(car);
                    当要获得weak reference引用的object时, 首先需要判断它是否已经被回收:
                    weakCar.get(); //如果此方法为空, 那么说明weakCar指向的对象已经被回收了.


                    11楼2020-09-03 10:55
                    回复
                      【实例】
                      下面来看一个例子:


                      12楼2020-09-03 10:55
                      回复


                        13楼2020-09-03 10:55
                        回复
                          改进版


                          14楼2020-09-03 10:55
                          回复


                            15楼2020-09-03 10:56
                            回复
                              在上例中, 程序运行一段时间后, 程序打印出"Object has been collected." 说明, weak reference指向的对象的被回收了.


                              16楼2020-09-03 10:56
                              回复