我正在阅读以下关于java中弱引用的帖子: -
Understanding Weak References.
在完成理论部分后,尝试测试 null条件的弱引用。但是,弱引用的 null check 永远不会在以下代码中返回true: -
package com.weak;
import java.lang.ref.WeakReference;
class Widget{}
public class WeakReferenceDemo {
public static void main(String[] args) throws InterruptedException {
Widget widget = new Widget() ;
WeakReference<Widget> valueWrapper = new WeakReference<Widget>(widget) ;
System.out.println( valueWrapper.get() );
//here strong reference to object is lost
widget = null ;
int count = 0 ;
//here checking for null condition
while( valueWrapper.get() != null ){
System.out.print(".");
Thread.sleep(432) ;
if(++count % 25 == 0) System.out.println();
}
System.out.println( valueWrapper.get() );
}
}
请提示,为什么 valueWrapper.get()不会返回null,但 widget 引用会被指定为空值。
感谢。
答案 0 :(得分:11)
不要等待垃圾收集,而是尝试使用Runtime.getRuntime().gc()
自行调用,然后检查null
的弱引用。
只有在GC运行时才能回收弱可到达的对象。由于您的程序没有将更多对象实例化到堆上,因此如果不手动要求它运行,这可能永远不会发生。
答案 1 :(得分:2)
WeakReference.get()不会返回null,直到垃圾回收器确定该对象只是弱可达。这可能需要一些时间。