demo代码:
import java.util.concurrent.TimeUnit;
public class ObjectHelpSelf {
private static ObjectHelpSelf objectHelpSelf = null;
@Override
protected void finalize() throws Throwable {
System.out.println("进入finalize方法中,对象开始自救");
//重新赋值
ObjectHelpSelf.objectHelpSelf = this;
}
public static void main(String[] args) throws InterruptedException {
objectHelpSelf = new ObjectHelpSelf();
objectHelpSelf = null;
System.gc();
//finalize方法的优先级很低,所以睡眠一秒,方便看到效果
TimeUnit.SECONDS.sleep(1);
System.out.println("第一次gc后,objectHelpSelf=" + objectHelpSelf);
objectHelpSelf = null;
System.gc();
//finalize方法的优先级很低,所以睡眠一秒,方便看到效果
TimeUnit.SECONDS.sleep(1);
System.out.println("第二次gc后,objectHelpSelf=" + objectHelpSelf);
}
}
运行结果如下:
总结
可以发现使用了finalize()方法,在第一次的gc时,ObjectHelpSelf对象没有被回收,自救成功,而第二次gc时,ObjectHelpSelf对象为null,说明对象被回收了,这是因为任何一个对象的finalize()方法最多只会被系统自动调用一次,不然每次gc,对象都自救,那对象就永远会存在,造成类似内存溢出的效果了。同时该方法不建议使用,仅做了解即可。