当前位置: 首页 > 面试题库 >

Java 9 Cleaner是否应优先于定稿?

谷梁波
2023-03-14
问题内容

在Java中,重载该finalize方法会产生不良的说唱效果,尽管我不明白为什么。诸如此类的类在Java 8和Java
10中都FileInputStream使用它来确保close被调用。但是,引入了Java 9
java.lang.ref.Cleaner,它使用PhantomReference机制而不是GC终结。起初,我认为这只是将终结处理添加到第三方类中的一种方法。但是,其javadoc中给出的示例显示了一个用例,可以很容易地用终结器重写。

是否应该finalize按照Cleaner 重写所有方法?(当然,我没有很多。只有一些使用OS资源的类,尤其是用于CUDA互操作的类。)

如我所知,Cleaner(通过PhantomReference)避免了的某些危险finalizer。特别是,您无权访问已清除的对象,因此您无法复活该对象或其任何字段。

但是,这是我所能看到的唯一优势。清洁也很重要。实际上,它和终结都使用ReferenceQueue!!(您不只是喜欢阅读JDK多么容易吗?)它比定稿要快吗?是否避免等待两个GC?如果有许多对象排队进行清理,它将避免堆耗尽吗?(所有这些答案在我看来都是“否”。)

最后,实际上并不能保证阻止您在清理操作中引用目标对象。请仔细阅读较长的API注意!如果您最终引用了该对象,则整个机制将无声地中断,这与完成过程总是试图li行一样。最后,虽然终结处理线程由JVM管理,但是创建和保留Cleaner线程是您自己的责任。


问题答案:

都不使用。

尝试使用资源从资源泄漏中恢复Cleaner所面临的挑战几乎finalize与最坏的挑战一样多,正如Holger提到的那样,这是过早的完成过程(不仅是finalize软/弱/幻象引用的问题,而且这也是一个问题)。即使您尽最大努力正确地实现了终结(同样,我的意思是任何使用软/弱/幻象引用的系统),您也无法保证资源泄漏不会导致资源耗尽。不可避免的事实是GC不了解您的资源。

相反,您应该假定资源将被正确关闭,查找并修复错误,而不是希望解决这些错误,并且仅 将finalization(以任何形式使用)用于调试

为此,我建议看看Netty派生的almson-refcount。它提供了基于弱引用的高效资源泄漏 检测器
,以及可选的引用计数工具,该工具比通常的AutoCloseable更加灵活。它的泄漏检测器之所以出色,是因为它提供了不同级别的跟踪(具有不同的开销),并且您可以使用它来捕获堆栈跟踪,以了解泄漏对象的分配和使用位置。



 类似资料:
  • 问题内容: 我已经了解了Java 和接口之间的区别。从Java 1.5开始,已将其他功能添加到接口,并已调用这些功能以保持向后兼容性。 我的问题是,现在我们有了接口,我们应该一直使用吗?不使用和使用的用例是什么? 问题答案: 两者都有其用途,并且都由java.util.concurrent中的Executor框架支持。Runnable已经存在了更长的时间,但是它仍然在使用并且不被阻止。 可调用程序

  • 我有一个关于Spring Security和Spring缓存的问题。假设我有一个方法,我已经用@PreAuthorize(“条件”)和@Cacheable(...)注释了这个方法,就像这样 @PreAuthorize(http://docs.spring.io/spring-security/site/docs/3.0.x/reference/ns-config.html)是否优先于@Cachea

  • 我是新来的工作与优先级队列和格式化此代码错误,我想让我的优先级是一个城市的直线距离,但我不相信我传递了这个信息正确的队列。查看API,我需要将SLD设置为比较器 [CNNVD]Public PriorityQueue PriorityQueue多个元素的排序问题(CNNVD-200605-045)Public PriorityQueue(int初始容量,比较器比较器) 创建具有指定初始容量的Pri

  • 是否有可用于 Haskell 的斐波那契堆/优先级队列?(甚至是渐近更好的?我在这个问题中找到了各种优先级队列实现的列表,但我找不到它们中的任何一个是否满足斐波那契堆的摊销运行时间: < li>Find-minimum是O(1)摊销时间。 < li >操作insert、decrease key和merge (union) work是O(1)摊销时间。 < li >操作删除和删除最小值是O(log

  • 这些天,我阅读了一些关于和的文档。我了解到Javascript是一个单线程,每次只会执行一段代码。同时,如果有事件发生,它会被推送到事件队列中并阻塞,直到适当的时间。我想知道,当许多事件被阻塞等待同时执行时。这些事件是否具有不同的优先级,因此高优先级事件会在低优先级事件之前执行。或者只是一个FIFO队列。 在上面的代码中,setTimeout fn1将在10 ms发生,Click事件处理程序fn2

  • 执行时将检索哪个bean? 根据Spring文档: 每个bean都有一个或多个标识符。这些标识符在承载bean的容器中必须是唯一的。 我有两个或 在同一个XML文件中有两个元素。