避免使用finalize()方法
finalize()被设计出来,允许在对象被回收之前,做一些系统资源释放的工作,比如I/O流关闭,网络连接释放等等。
但是finalize()应该避免使用,原因如下:
- [ ] finalize不保证会被调用,因为是垃圾回收是系统行为,程序不能严格控制垃圾回收的执行,而finalize只在该对象被回收时才会触发。
- [ ] finalize对性能影响很大 :
增加了finalize()的对象,创建和销毁明显需要更多的时间
- [ ] finalize在对象回收时被调用是需要JVM中支持的,不同的JVM对其支持程度不同,可能出现不同JVM上行为不一致的问题
[ ]子类中的finalize需要显式地调用super.finalize()才能保证父类对象的finalize()被触发。否则父类的finalize()永远不会被调用。
[ ] Runtime.getRuntime().runFinalization();可以建议GC尽量执行该对象的finalize()方法,但是并不保证。另外这个方法己被弃用,因为它有可能使得正在被其他线程操作的对象的finalize方法被调用,从而导致异常或者死锁。
[ ] finalize()中如果发生异常,不会有任何日志记录或者提醒。