java - 在 Java9 中,终结器已被弃用,取而代之的是引入了清理器。两者有什么区别?

标签 java java-9 object-reference finalize

<分区>

在 Java9 中,终结器已被弃用,并引入了清洁器的新概念。具体原因是什么?是否有任何特定的场景或原因应该优先使用清洁器而不是终结器(假设不推荐使用它们)。?

最佳答案

Deprecation of Finalizer在寄存器中说明决定的原因:-

Finalizers are inherently problematic and their use can lead to performance issues, deadlocks, hangs, and other problematic behavior.

Furthermore, the timing of finalization is unpredictable with no guarantee that a finalizer will be called. Classes whose instances hold non-heap resources should provide a method to enable explicit release of those resources, and they should also implement java.lang.AutoCloseable if appropriate.

proposed solution as an alternative to using the Finalizers were the introduced Cleaners这将为对象提供简单的注册和取消清理功能。

The Cleaner and PhantomReference provide more flexible and efficient ways to release resources when an object becomes unreachable.

应用程序创建一个清理服务供自己使用,并且该服务在不再使用时终止。

使用:一旦对象变成幻影reachable对其执行的清理操作由 Cleaner 注册和管理。注册对象引用和相应的清理操作返回 Cleanable .最有效的用法是在对象关闭或不再需要时显式调用 clean 方法。

注意:在 Java9 之前,Cleaner 的类似实现是 residing under sun.misc package

关于java - 在 Java9 中,终结器已被弃用,取而代之的是引入了清理器。两者有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48533097/

相关文章:

java - 这段Java代码可以变得更高效吗

java - 使用 Java 8 Stream 读取文本文件 block

java - IntelliJ 2018.1 首选项中的 “Use ' --release' 选项是什么?

java - 流编程 : subscriber and publisher to keep track of count?

vb.net - 对非共享成员的引用需要在调用公共(public)子时发生对象引用

java - 这是转义 SQL 查询参数的安全方法吗?

java - Maven企业应用程序最终以-1.0运行

java - 为什么要求传递仅限于直接需要包含它的模块的模块?

.NET XmlSerializer 和对同一对象的多个引用

java - 如何获取实例对象引用的类型?