是保证在Java中调用的终结器吗?

时间:2012-12-21 01:16:23

标签: java android jvm dalvik finalizer

是否保证在Java中调用终结器?如果它从JVM到JVM不同,那么Dalvik VM for Android的案例呢?

3 个答案:

答案 0 :(得分:4)

不,不保证会被呼叫。不要依赖终结器来释放资源。

https://www.securecoding.cert.org/confluence/display/java/MET12-J.+Do+not+use+finalizers

答案 1 :(得分:2)

以下是java教程Object as a Superclass

的摘录
  

finalize()方法

     

Object类提供了一个回调方法,finalize(),当它变为垃圾时,可以在对象上调用它。对象的finalize()实现没有任何作用 - 你可以覆盖finalize()来进行清理,例如释放资源。

     

finalize()方法可以由系统自动调用,但是当它被调用时,或者即使它被调用,也是不确定的。因此,您不应该依赖此方法为您进行清理。例如,如果在执行I / O后没有在代码中关闭文件描述符,并且您希望finalize()为您关闭它们,则可能会用完文件描述符。

最后一段是重要段落。

答案 2 :(得分:0)

终结器只是要在回收实例之前保证执行的东西。我确信它遵循Dalvik VM的相同规则。除此之外,即使最终调用终结器,也会在不可预测的点上执行,并且以vm特定的方式执行,因此您最好将其用作安全网。在JDK 7之前,唯一的方法是为您的类导出显式资源释放方法,并在想要确保释放资源时显式调用它们。尝试使用资源可以减轻JDK7的使用情况。 Autoclose shou