java - 为什么 finalize() 只被垃圾收集器调用一次?

标签 java garbage-collection finalize

SCJP 6 学习指南引述:

In the finalize() method you could write code that passes a reference to the object in question back to another object, effectively uneligiblizing the object for garbage collection. If at some point later on this same object becomes eligible for garbage collection again, the garbage collector can still process this object and delete it. The garbage collector, however, will remember that, for this object, finalize() already ran, and it will not run finalize() again

为什么会这样设计? finalize() 方法的目的仍然有效,即使对象第二次被标记为收集。那么为什么 Java 决定跳过对 finalize() 的调用?

最佳答案

我不知道这是否是最初的原因,但当前的实现将 Finalizer 实例(Reference 的内部子类)排队,用于使用内部 ReferenceQueue 覆盖 finalize 方法的对象。由专用的 FinalizerThread 轮询。

并且由于 JVM 无法知道对象是否需要第二次完成,所以它无法决定是否必须在 finalize() 之后将新的 Finalizer 加入队列 方法已被调用。

无论如何,你应该避免使用finalize()。它使对象分配成本更高,防止逃逸分析,并且不是管理 native 资源的非常可靠的方法,因为 GC 可以无限期地推迟完成。

关于java - 为什么 finalize() 只被垃圾收集器调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31815678/

相关文章:

java - 如何将图像文件从亚马逊 s3 移动到亚马逊 ec2 并使用 java 运行实例

java - 密码中连字符的正则表达式

java - 以 spring bean 作为属性的垃圾收集清理对象

java - EMR Spark java 应用程序 GC 问题

java - 当调用 System.gc() 或 finalize() 方法时,内部(JVM)发生了什么?

java - 为什么我不能在泛型类上静态引用内部类的静态方法?

java - 为什么我们不能对公共(public)方法使用断言?

.net - 在抛出 OutOfMemoryException 之前调用 GC.Collect

java - 尝试减少 java jdk 1.8.0 中的静态计数变量

Java Finalizer 方法和 GC