0

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

4

3 回答 3

4

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

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

于 2012-12-21T01:18:16.410 回答
2

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

finalize() 方法

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

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

最后一段是重要的。

于 2012-12-21T01:25:08.517 回答
0

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

于 2012-12-21T01:44:58.553 回答