public class Test {
public static void main(String[] args) throws Exception {
A aObject = new A();
ReferenceQueue<A> queue = new ReferenceQueue<>();
PhantomReference<A> weak = new PhantomReference<>(aObject, queue);
aObject = null;
System.gc();
TimeUnit.SECONDS.sleep(1);
System.out.println(queue.poll());
}
}
class A{
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
super.finalize();
System.out.println("finalize");
}
}
结果是:
finalize
null
但如果我删除类A中的finalize方法,结果是:
java.lang.ref.PhantomReference@5b2c9e5d
因此,结果显示当我重写finalize方法时,弱对象没有放入引用队列中,这是因为aObject复活了吗?但我在finalize方法中什么都没做。
super.finalize()
或者System.out.println(...)
并不会改变行为。取消整个方法的注释会导致期望的行为。将super.finalize()
和System.out.println(...)
放置在if (false) { ... }
中也会产生期望的行为,而将这两个语句放置在if (true) { ... }
中则会产生意外的行为。在Oracle Java 1.8.0_151中进行了测试。也许这有点有用。 - Turing85