软引用回收的问题

使用软(弱)引用可以使得内存吃紧jvm进行garbage collection的时候回收掉 被软(弱)引用指向的对象,避免oom内存溢出.
使用如下:

WeakReference<Object> weakRef = WeakReference<Object>(new Object());

问题来了.
如果之后还有这么一句:

Object ref = weakRef;

那么,这个对象算不算是 被WeakReference引用?在ref 不被 改变指向的情况下,这个对象会不会被回收?

阅读 4.3k
2 个回答

WeakReference是弱引用,SoftReference是软引用
ref是强引用,指向了weakRef,weakRef对象是强可达的,weakRef指向的对象无法通过强引用和软引用reach,所以还是弱可达的,会被回收。

关于可达性和回收时间
An object is weakly reachable if it is neither strongly nor softly
reachable but can be reached by traversing a weak reference. When the
weak references to a weakly-reachable object are cleared, the object
becomes eligible for finalization.

    public static void main(String[] args) {
        WeakReference<Object> wr = new WeakReference<Object>(new Object());
        int i=0;
        Object sr2 = wr;
        while(true){
            System.out.println(i);
            if(wr.get()!=null){
                i++;
                System.out.println("wr can reach "+wr.get());
            }else{
                System.out.println("null");
                break;
            }
            System.gc();
        }
    }

测试代码,wr在i=1时即被回收了

要搞清楚一点,你的弱引用对象指向Object对象
然后你把Object对象的引用ref又指向了弱引用对象
只要一个对象只被软引用所引用,这个对象就不会活到下次垃圾收集发生后。
所以,回答你的两个问题:

  1. 这个对象是只被WeakReference对象所引用。

  2. 在这个WearReference对象引用不改变指向的情况下,Object对象会存活到下一次垃圾收集发生前。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题