java - finalize() 在 Java 中如何工作?

标签 java multithreading memory-management garbage-collection finalize

所以,我最近发现了 Java 中的 finalize 方法(不知道为什么我之前错过了它,但它确实存在)。这似乎可能是我正在处理的许多问题的答案,但我想先获得更多信息。

在网上,我找到了这张图来说明垃圾收集和终结的过程:

This describes the order of operations involving finalize and the JGC:

几个问题:

  1. 这发生在一个单独的线程中,对吗?
  2. 如果我在完成过程中实例化一个新对象会怎样?允许吗?
  3. 如果我从 finalize 调用静态方法会怎样?
  4. 如果我在 finalize 中建立对对象的新引用会怎样?

我想我应该解释一下我为什么感兴趣。我经常使用 LWJGL,看来如果我可以使用 finalize 使 Java 对象自动清理 OpenGL 资源,那么我可以在 API 方面做一些非常好的事情。

最佳答案

finalize() 由 Java 垃圾收集器在检测到不存在对该特定对象的引用时调用。 finalize() 是所有 Java 对象通过 Object 类继承的。

据我所知,您可以毫不费力地从 finalize() 方法 I 进行静态方法调用,并且您可以从 finalize() 建立对它的新引用 - 但是我会说这是糟糕的编程习惯。

您不应该依赖 finalize() 进行清理,最好边清理边清理。我更喜欢使用 try、catch、finally 来清理,而不是使用 finalize()。特别是,通过使用 finalize(),您将导致 JVM 保留您的可终结对象引用的所有其他对象,以防它调用它们。这意味着您保留可能不需要使用的内存。更重要的是,这也意味着您可以使 JVM 永远不会结束处理对象,因为它们必须保留它们以防另一个对象的 finalize 方法需要它,例如竞争条件。

此外,请考虑完全有可能不调用 GC。因此,您实际上无法保证最终会调用 finalize()。

当你用完资源时清理资源,不要依赖 finalize() 来完成这是我的建议。

关于java - finalize() 在 Java 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9556827/

相关文章:

java - 优化java方法(根据骰子找出到达某一点的所有方法)

java - Spring @QuerydslPredicate 问题

java - Apache Camel 避免在类似的 XML 路由中重复选项

c - 实现多线程 fork

java - 在 Java 中什么是更快地传递参数或使用静态变量?

ubuntu - Ubuntu 或 Android Eclipse 中的 OpenJDK

c++ - 终止在不同 QThread 中运行的 QProcess

c++ - 如何在元素填充过程中经济地存储稀疏矩阵?

Java对象数组——硬件内存缓存的使用

c - 在堆栈和堆上分配内存的埃拉托斯特尼筛法的内存错误