弱引用问题,大家帮忙看看
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了。 |