如果一个类实现了 finalize 方法,那么当类生成的对象要被垃圾回收时,会先执行该方法。
示例:
public class FinalizeTest {
static class Person {
String name;
@Override
protected void finalize() throws Throwable {
System.out.println("finalize " + name);
super.finalize();
}
}
public static void main(String[] args) {
Person p = new Person();
p.name = "ltt";
p = null; // 此后,p原先指向的Person对象会在某个时间被 gc 回收掉
System.gc(); // 建议 JVM 进行 gc 操作,但不一定会进行 gc 操作
System.runFinalization(); // 执行将要被销毁的对象的 finalize 方法
}
}
运行结果:
finalize ltt
为了触发 gc行为,用了下面的代码:
System.gc(); // 建议 JVM 进行 gc 操作,但不一定会进行 gc 操作
System.runFinalization(); // 执行将要被销毁的对象的 finalize 方法
这个代码不保证一定会触发 gc 操作,但在这个示例中是有用的。
如果去掉这两行,Person 的 finalize 不会被触发。可能是因为进行结束可以直接清理内存,所以就不 gc 了。