Java 幽灵引用

4

您好,我可以帮您理解PhantomReference。我知道PhantomReference可以帮助跟踪对象何时从堆中移除,并在finalize方法调用后仍然可达。我尝试通过一些代码来深入了解,但是我无法正确地实现,例如:

 class Foo{

    private String a;
    public Foo(String a){
        this.a = a;
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();             
        System.out.println("calling finalize");
    }

    @Override
    public String toString() {
        return "Foo{" + "a=" + a + '}';
    }                                


}

我认为做这样的事情:

    ReferenceQueue q = new ReferenceQueue();                
    PhantomReference<Foo> pr = new PhantomReference(new Foo("myphantom"), q);        

    System.out.println("Object created trying to gc");

    System.gc();        
    Thread.sleep(5000L);                              

    System.out.println(q.poll());

我将给你一个PhantomReference的实例,但我得到的是null。


你是说你尝试从PhantomReference中检索的对象为空吗?根据JavaDocs的说明,“幽灵引用的get方法始终返回null。” - bdkosher
@bdkosher 是的,我知道,但在这个例子中,我正在尝试从RefrenceQueue获取PhantomReference的实例,而不是PhantomReference的引用。 - Krzysztof Szewczyk
1个回答

1

这是对我有效的方法。

        ReferenceQueue<Foo> q = new ReferenceQueue<Foo>();
        PhantomReference<Foo> pr = new PhantomReference<Foo>(new Foo("myphantom"), q);
        System.gc();
        System.runFinalization();
        System.gc();
        System.runFinalization();
//      Reference<? extends Foo> remove = q.remove(5000L); 
        System.out.println(q.poll());

我在这里找到了你问题的答案: Java: PhantomReference、ReferenceQueue 和 finalize


垃圾回收的工作不是调用enqueue吗? - Krzysztof Szewczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接