程序员都了解初始化的重要性,但是会常常忘记同样重要的清理工作,java有垃圾回收器负责回收无用对象占用的内存资源,但是也有特殊情况,你的对象获得了一块特殊的内存区域,并不是通过 new 方法,由于垃圾回收器只知道释放那些经由new分配的内存, 所以它不知道如何释放这些特殊的内存。
java 考虑到这种情况,允许在类中定义一个名为 finalize()
的方法。他的工作原理是这样的:一旦垃圾回收器准备释放对象占用的存储空间,将首先调用 finalize()
方法,并在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存。就像为垃圾回收器添加一个回调方法一样。
注意: 垃圾回收并不能保证一定能发生,也许你会发现,只要程序没有濒临存储空间用完的那一刻,对象占用的空间永远得不到释放,甚至程序运行结束 垃圾回收器也没有释放你创建的任何对象的存储空间,而是随着操作程序的退出,将资源全部还给操作系统,这个策略是恰当的,因为垃圾回收本身也有开销,要是不实用它,也就不用支付这部分开销了。
finalize 用户何在
到此我们应该明白,不该将 finalize () 作为通用的清理方法,请记住重要的一点,垃圾回收应该只与内存有关。所以和垃圾回收有关的任何行为尤其是finalize 方法,他们也必须同内存及其回收有关
上面说的特殊的内存区域是怎么创建出来的呢?
因为java中一切都是对象,任何区域中的内存都是依附于对象的,这样就将这部分区域限制到很少的场景。那就是可能在java中使用了类似与 C语言 malloc() 方法来分配内存。通过这种方式分配内存,只能使用 free() 方法来释放,否则就会发生内存泄露。
现在我们应该明白,不要过多的使用 finalize() 方法的道理了,因为他确实不是进行普通的清理工作的合适场所。
- 参考资料
《Think in Java》