弱引用问题,大家帮忙看看

rxin2009 2012-11-01
import java.lang.ref.*;

public class ReferenceTest {
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++){
            Obj o = new Obj("weak");
            WeakReference<Obj> weak = new WeakReference<Obj>(o);
            o = null;
            System.gc();
            System.out.println(weak.get());
        }
    }
}

class Obj {
    private final String name;
    
    Obj(String name) {
        this.name=name;
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("执行finalize方法:" + name);
        super.finalize();
    }

    @Override
    public String toString() {
        return name;
    }
}


程序输出结果是
null
执行finalize方法:weak
我的问题是为什么总是输出null,每次都执行了gc?
RednaxelaFX 2012-11-01
你可以试试打开-XX:+PrintGCDetails -XX:+PrintReferenceGC这两个参数来观察。

贴一段输出出来:
[Full GC (System)[SoftReference, 0 refs, 0.0001199 secs][WeakReference, 4 refs, 0.0001090 secs][FinalReference, 1 refs, 0.0001078 secs][PhantomReference, 0 refs, 0.0001026 secs][JNI Weak Reference, 0.0000038 secs] [PSYoungGen: 64K->0K(18688K)] [PSOldGen: 464K->464K(42688K)] 528K->464K(61376K) [PSPermGen: 2450K->2450K(21248K)], 0.0130065 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]

null
执行finalize方法:weak

如果你用一个fastdebug或者debug版的HotSpot VM来执行的话可以进一步打开-XX:+TraceReferenceGC来观察到底被处理的弱引用是“谁”。

============================

简单来说,HotSpot VM在GC的过程中会进行弱引用发现及处理;当发现某个对象仅仅是“弱可到达”(weakly-reachable)的时候,这个对象就可以被GC回收,而引用着它的弱引用里的reference字段就会被GC置为null。

于是在GC后,当你对着这样的弱引用调用get()方法,自然只会得到null了。
Global site tag (gtag.js) - Google Analytics