在finalize方法中的异常

时间:2012-06-27 19:29:30

标签: java garbage-collection

  

可能重复:
  method finalize and exceptions

当一个对象即将从内存中释放时,垃圾收集器会调用finalize()方法。在finalize()方法中引发异常时会发生什么?

GC会继续进行并释放内存,否则GC将暂停该对象的进程?

2 个答案:

答案 0 :(得分:9)

如果在try-catch语句中引发异常并且正确捕获,那么“GC将继续进行”,就像在常规程序中一样。

但是如果没有处理抛出的异常,那么根据JSL

  

如果在完成期间抛出未捕获的异常,则忽略该异常并终止该对象的终止。

因此,在这种情况下,“GC将暂停该对象的进程”,在这种情况下,可能是某些资源未正确释放。

顺便说一下,终结器有两个缺点:

  • 您无法确定是否会执行finalize方法(来自this blog

      

    为什么上面的垃圾收集器总是在释放与对象关联的内存之前调用finalize?原因是因为垃圾收集器在JVM终止之前并不总是有机会清理对象。

  • 终结器强制将对象提升为旧空间(需要更长时间才能收集),并推迟GC直到终结器运行,从而为GC算法增加了更多开销。 (参见Jack Shirazi的Java性能调优第二版)。

答案 1 :(得分:0)

“finalize方法抛出的任何异常都会导致暂停此对象的终结,但会被忽略。” http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#finalize()