Java WeakReference不';t返回null,尽管没有对实际引用对象的强引用

Java WeakReference不';t返回null,尽管没有对实际引用对象的强引用,java,reference,weak-references,Java,Reference,Weak References,我正在浏览以下关于java中弱引用的帖子:- 在完成理论部分后,尝试测试空条件的弱引用。但是,弱引用的空检查在以下代码中永远不会返回true:- package com.weak; import java.lang.ref.WeakReference; class Widget{} public class WeakReferenceDemo { public static void main(String[] args) throws InterruptedException

我正在浏览以下关于java中弱引用的帖子:-

在完成理论部分后,尝试测试空条件的弱引用。但是,弱引用的空检查在以下代码中永远不会返回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() );
    }
}
package.com.弱;
导入java.lang.ref.WeakReference;
类小部件{}
公共类WeakReferenceDemo{
公共静态void main(字符串[]args)引发InterruptedException{
Widget Widget=newwidget();
WeakReference valueWrapper=新的WeakReference(小部件);
System.out.println(valueWrapper.get());
//这里对对象的强引用丢失
widget=null;
整数计数=0;
//这里检查空条件
while(valueWrapper.get()!=null){
系统输出打印(“.”);
睡眠(432);
如果(++计数%25==0)System.out.println();
}
System.out.println(valueWrapper.get());
}
}
请建议,为什么valueWrapper.get()不返回null,尽管小部件引用被分配了null值


谢谢。

与其等待垃圾回收,不如尝试使用
Runtime.getRuntime().gc()
自己调用它,然后检查弱引用中的
null


弱可达对象仅在GC运行时回收。由于您的程序不会在堆上实例化更多的对象,因此,如果不手动要求它运行,就永远不会发生这种情况。

WeakReference.get()不会返回null,直到垃圾收集器确定该对象只能弱地访问。这可能需要一些时间。

GC不是引用计数,当您将该引用设为空时,GC甚至还不知道它-它将在下一个GC周期中找到它。