Java 经验法则7 避免使用终结方法(finalize)

2014-01-08

Java 经验法则7 避免使用终结方法(finalize)

2014-01-08

垃圾回收器要回收对象的时候,首先要调用这个类的终结方法(finalize方法)。请尽量避免在该方法里做回收或关闭占用资源操作,因为终结方法是不可预测的,也是很危险的。终结方法的缺点在于不能保证会被及时地执行。从一个对象变得不可用开始,到它的终结方法被不执行,所花费的这段时间是任意长的,这意味着,注重时间的任务不应该由终结方法来完成。例如,用终结方法来关闭已经打开的文件,这是严重错误,由于JVM会延迟执行终结方法,所以大量的文件会保留在打开状态,当一个程序再不能打开文件时,它可能运行失败。

Java语言规范不仅不保证终结方法会被及时地执行,而且根本就不保证它们会被执行,当一个程序终止的时候,某些已经无法访问的对象上的终结方法缺根本没有被执行,这是完全有可能的。结论:不应该依赖终结方法来更新重要的持久状态。

还有一点,使用终结方法有个非常严重的性能损失。创建和销毁一个简单对象的时间大约为5.6ns。增加一个终结方法使时间增加到了2400ns。换句话说,用终结方法创建和销毁对象慢了大约430倍。

对于需要终止的资源(文件或者线程),只需提供一个显式的终止方法,并要求该类的客户端在每个实例不再有用的时候调用这个方法。值得提及的一个细节是,该实例必须记录下自己是否已经被终止了。