finalize方法中的exception

可能重复:
方法最终确定和例外

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

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

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

但是,根据JSL的说法,如果没有处理抛出的exception,

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

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

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

  • 您无法确定是否会执行finalize方法(来自此博客 )

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

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

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