Java PhantomReference

时间:2015-11-25 12:30:21

标签: java

请理解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。

1 个答案:

答案 0 :(得分: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 and finalize