当一个对象即将从内存中释放时,垃圾收集器会调用finalize()
方法。在finalize()
方法中引发异常时会发生什么?
GC会继续进行并释放内存,否则GC将暂停该对象的进程?
答案 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()