可能重复:
方法敲定和异常
垃圾收集器调用finalize()
方法时,其目的在于将要从存储器释放。 当一个异常的升高,会发生什么finalize()
方法?
将GC进行进一步和释放内存,或GC将停止该对象的过程吗?
可能重复:
方法敲定和异常
垃圾收集器调用finalize()
方法时,其目的在于将要从存储器释放。 当一个异常的升高,会发生什么finalize()
方法?
将GC进行进一步和释放内存,或GC将停止该对象的过程吗?
如果异常是在try-catch语句提出并正确捕获然后是,“GC将进一步进行”,因为它在经常方案一样。
但是,如果抛出的异常没有被处理,然后,根据JSL ,
如果未捕获的异常定稿过程中引发的异常被忽略,并且该对象的终结终止。
所以,在这种情况下,“GC将停止该对象的过程”,并在这种情况下,它可能是一些资源没有被正确地释放。
顺便说一句,终结有2个缺点:
你不能肯定的是,finalize方法将永远被执行(从这个博客 )
为什么上面,如果垃圾收集器总是会调用释放与对象关联的内存之前完成? 究其原因是因为垃圾收集器并不总是得到一个机会来清理对象的JVM终止之前。
终结力物体被提升到旧空间(这需要更长的时间来收集),直到终结运行推迟GC,增加更多的开销到GC algotithm。 (CF Java性能优化2日,由杰克·希拉兹版)。
“由finalize方法抛出的任何异常导致要停止该对象的最后确定,否则忽略。” http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#finalize()