Java的语言规范中并没有保证该方法会被及时的执行,甚至都没有保证一定会被执行。即便开发者在code中手工调用了 System.gc 和 System.runFinalization 这两个方法,这仅仅是提高了finalizer被执行的几率而已。还有一点需要注意的是,被重载的finalize()方法中如果抛出异常,其栈帧轨迹是不会被打印出来的。在Java中被推荐的资源释放方法为,提供显式的具有良好命名的接口方法,如 FileInputStream.close() 和 Graphic2D.dispose() 等。然后使用者在finally区块中调用该方法,见如下代码:
public void test() { FileInputStream fin = null; try { fin = new FileInputStream(filename); //do something. } finally { fin.close(); } }在实际的开发中,利用finalizer又能给我们带来什么样的帮助呢?见下例:
public class FinalizeTest { //@Override protected void finalize() throws Throwable { try { //在调试过程中通过该方法,打印对象在被收集前的各种状态, //如判断是否仍有资源未被释放,或者是否有状态不一致的现象存在。 //推荐将该finalize方法设计成仅在debug状态下可用,而在release //下该方法并不存在,以避免其对运行时效率的影响。 System.out.println("The current status: " + _myStatus); } finally { //在finally中对超类finalize方法的调用是必须的,这样可以保证整个class继承 //体系中的finalize链都被执行。 super.finalize(); } } }
原文地址:http://blog.csdn.net/aoshilang2249/article/details/45765177