9

可能的重复:
方法完成和异常

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

GC 会继续进行并释放内存,还是 GC 会停止该对象的进程?

4

2 回答 2

11

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

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

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

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

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

  • 你不能确定 finalize 方法是否会被执行(来自这个博客

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

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

于 2012-06-27T19:51:09.957 回答
0

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

于 2012-06-27T19:32:16.633 回答