finalize()方法是Object中的方法,可以被任何类进行重新。在GC回收对象之前该方法会被调用。通过如下代码可以简单了解一下该方法:
public class FinalizeEscape { public static FinalizeEscape SAVE_HOOK = null; public void isAlive() { System.out.println("i am alive ..."); } @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("finalize method ....."); FinalizeEscape.SAVE_HOOK = this; } public static void main (String[] args) throws Exception{ SAVE_HOOK = new FinalizeEscape(); for (int i = 0; i < 2; i++) { SAVE_HOOK = null; System.gc(); Thread.sleep(500); if (SAVE_HOOK != null) { SAVE_HOOK.isAlive(); } else { System.out.println("i am dead ..."); } } } }
程序的运行结果如下:
从程序的运行结果可知,finalize()方法在执行System.gc()时会被触发。但需要注意的时,该方法只会被系统自动调用一次。
对于此方法,大家简单的了解一下即可,此方法的运行代价大、不确定性大、无法保证各个对象的调用顺序,且该方法能做的工作,使用其他的方式都可以做的更好,所以大可忘掉该方法的存在。
参考《深入理解Java虚拟机 JVM高级特性与最佳实践》