WeakReference 弱引用可以让您保持对对象的引用,同时允许GC在必要时释放对象,回收内存。对于那些创建便宜但耗费大量内存的对象,即希望保持该对象,又要在应用程序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用。上面是对弱引用的描述,但是我有个疑问:      那就是如果我现在使用弱引用指向了一个对象,但是创建完之后,垃圾回收器GC运行了,对垃圾进行回收,那么我的这个对象就被回收了,这不就相当于白创建了吗?
      

解决方案 »

  1.   

    弱引用是配合强引用一起使用的,不是单独使用按照你的理解,代码应该是这个样子的,
    WeakReference ref = new WeakReference(new Object())
    当你创建出来一个弱引用的时候,这个弱引用对应的对象可能很快就被释放了,因为没有强引用指向它实际上弱引用是这样用的
    WeakReference ref;//这里一般是成员变量之类的,用于缓存逻辑代码
    Object obj = null;
    if(ref != null) obj = ref.get(); //先取缓存对象
    if(obj == null){
        //如果没有缓存对象就创建一个,同时存到缓存里面去
        obj = new Object();
        ref = new WeakReference(obj);
    }
    //其它业务逻辑
    obj......
      

  2.   

    我了解怎么处理弱引用被gc回收后的防崩溃处理,我的问题只是:如果弱引用很快被回收了,那么弱引用创建的意义何在?
    你的意思是:当gc回收了弱引用,那么需要再创建一个对象,然后用这个若引用指向这个对象?但是对象已经变了,那么对象所有的信息肯定也改变了。所以这种方法肯定是不行的。
      

  3.   

    我了解怎么处理弱引用被gc回收后的防崩溃处理,我的问题只是:如果弱引用很快被回收了,那么弱引用创建的意义何在?
    你的意思是:当gc回收了弱引用,那么需要再创建一个对象,然后用这个若引用指向这个对象?但是对象已经变了,那么对象所有的信息肯定也改变了。所以这种方法肯定是不行的。
    弱引用有多个使用场景:
    1.对象的缓存,重用,避免频繁gc和new
    2.使用弱引用持有对象,可以避免内存泄漏你这种情况下,既然对之前的状态有依赖,肯定不能使用弱引用。
    弱引用不是万能的,也不是随便哪里想用就用的