Java 终结器和 Java 文件输入/输出流

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(240)   2023-11-16 16:34:57

在我直接与他们合作或花时间了解他们之后,我经常发现自己会更多地关注在线话题。最近 Stephen Connolly (CloudBees) 的帖子 FileInputStream / FileOutputStream Considered Harmful 引起了我的注意,因为 我最近的问题 Java 的终结器。在 那篇文章 中,作者谈到了 java.io.FileInputStreamjava.io.FileOutputStream 实现重写的 finalize( ) 方法 FileInputStream.finalize()FileOutputStream.finalize()。关于在 JDK 9 中弃用终结器,我的观点是,一个我多年未曾想过的话题突然出现在我身边。

Connolly 的帖子引用了 Hadoop JIRA HDFS-8562(“HDFS Performance is impacted by FileInputStream Finalizer”)。该 JIRA 于 2015 年 6 月开放,其描述包括有趣的背景,说明为什么 FileInputStream 的终结器会导致使用 HDFS 的人出现问题。这个 JIRA 也很有趣,因为它研究了为什么将 FileInputStreamFileOutputStream 更改为不使用 protected finalize()方法。

JDK-8080225(“FileInputStream cleanup should be improved.”)在 HDFS-8562 中引用并于 2015 年 5 月编写。它指出,“FileInputStream 依赖于完成执行如果 FIS 尚未关闭,final 将关闭。这会导致突发性 GC 的额外工作。 FileInputStreams 的清理应该尽快进行,并且不会增加 GC 的开销。”艾伦·贝特曼 (Alan Bateman) 对此发表了评论,称“可以通过使用 Files.newInputStream 轻松解决此问题。” Roger Riggs 写到充分解决这个问题的困难,“由于未知/不可知有多少 FIS/FOS 子类可能依赖于重写关闭或最终确定兼容性问题是严重的。只有长期(多次发布)限制弃用或使覆盖无效才有可能最终消除兼容性问题。”

Connolly 在文章结尾提到 Jenkins 通过 JENKINS-42934(“避免使用新的 FileInputStream / new FileOutputStream”)改变了这一点。将 new FileInputStream 更改为 Files.newInputStream 的示例可从那里获得

事实上,我已经能够使用 Java 这么多年而不用担心终结器,即使我使用了诸如 FileInputStream 之类的类,这一事实本身也证明了这些类与 finalize()的使用是有限的> 实现不一定会导致垃圾收集或其他问题。我喜欢 Colin P. McCabe 在 HDFS JIRA 中对此问题的阐述:非常少量的对象。就像我之前提到的,我们遇到的终结器的大问题是短路读取流缓存。如果我们能解决这个问题,就像这个补丁试图做的那样,我们将消除大部分问题。”换句话说,并非所有 FileInputStreamFileOutputStream 的使用都值得关注。使用工具来识别与终结器相关的异常高的垃圾收集是识别那些需要解决的问题的最佳方法。

在多年的 Java 开发中,我没有使用过或案例过 Java 终结器。最近几个月,我看到越来越多的人在处理这个问题。 弃用 Java 终结器 是将其从核心 API 中移除的良好开端。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-java-finalizer-java-file-inputoutput-streams.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...