【问题标题】:is finalizers guaranteed to be called in Java? [closed]是否保证在 Java 中调用终结器? [关闭]
【发布时间】:2012-12-21 01:16:22
【问题描述】:

是否保证在 Java 中调用终结器?如果 JVM 和 JVM 不同,那么 Dalvik VM for Android 的情况如何?

【问题讨论】:

标签: java android jvm dalvik finalizer


【解决方案1】:

不,不能保证它们会被调用。不要依赖终结器来释放资源。

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

【讨论】:

  • OP 要求finalize 而不是finally
  • +1 参考 try-with-resources
【解决方案2】:

这里是java教程Object as a Superclass的摘录

finalize() 方法

Object 类提供了一个回调方法 finalize(),当对象变成垃圾时,可以调用该方法。 Object 的 finalize() 实现什么都不做——你可以重写 finalize() 来进行清理,比如释放资源。

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

最后一段很重要。

【讨论】:

    【解决方案3】:

    终结器只是保证在实例被回收之前执行的东西。我确信它在 Dalvik VM 上遵循相同的规则。除此之外,即使最终调用了终结器,也有在不可预测的点上执行,并且以 vm 特定的方式执行,所以你最好将它用作安全网。在 JDK 7 之前,唯一的方法是为您的类导出显式资源释放方法,并在需要确保资源释放时显式调用它们。 Try-with-resources 可以让您摆脱 JDK7 的困境。应该自动关闭

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      相关资源
      最近更新 更多