A
类的实例是垃圾回收还是永久保留在内存中?当finilize方法设置对象对对象属性的引用时会发生什么
我知道如果一个对象符合垃圾回收的条件,并且它的finalize()
方法已经被调用,并且在这个方法中对象可以被一个活动的执行线程访问,它不会被垃圾回收。
public class A{
String someString = null;
private A a=null;
public String getSomeString() {
return someString;
}
public void setSomeString(String someString) {
this.someString = someString;
}
@Override
protected void finalize() throws Throwable {
try {
this.a=this;
System.out.println("final called");
} finally {
super.finalize();
}
}
}
public static void main(String args[]) throws Exception {
A s1=new A();
s1=null;
System.gc();
System.out.println("gc called");
......
}
灵感来自Can we switch off finalizers?
this.a =这不会阻止gc,仍然没有提及这个对象的某些'生命',因此它会是gc。如果你想从别的东西(如活线程)中引用它,那么它可能会存活下来。 – Vladp
@Vladp做出这个答案,你会得到我的最高票... –
@Vladp我认为this.a =这分配给它的属性的引用? 纠正我,如果我错了.. –