4.9w+
社区成员
public class FinalizeEscapeGC {
class A {};
private static FinalizeEscapeGC SAVE_HOOK = null;
private A a = new A();
public void isAlive() {
System.out.println("yes! i'am still alive.");
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize method executed!");
FinalizeEscapeGC.SAVE_HOOK = this;
}
public static void main(String[] args) throws Throwable{
SAVE_HOOK = new FinalizeEscapeGC();
SAVE_HOOK = null;
System.gc();
Thread.sleep(500);
if ( SAVE_HOOK != null) {
SAVE_HOOK.isAlive();
} else {
System.out.println("no, i'm dead!");
}
}
}
类FinalizeEscapeGC重写了finalize方法,类A没有重写finalize方法。当执行SAVE_HOOK = null后,这两个对象都不可达了,如果对类A的对象只标记一次就清除的话,那么类FinalizeEscapeGC在finalize方法“自我拯救”后的属性a就被清除了,就不在是原来的那个FinalizeEscapeGC了。