Java Finalizer和Java文件输入/输出流
在与主题直接合作或花时间学习它们之后,我经常会发现自己在网上注意到更多主题。 最近的Stephen Connolly ( CloudBees )发表FileInputStream / FileOutputStream被认为有害的消息引起了我的注意,因为我最近在Java的finalizer中遇到了问题 。 在那篇文章中 ,作者讨论了实现重写的finalize()方法FileInputStream.finalize()和FileOutputStream.finalize()的java.io.FileInputStream和java.io.FileOutputStream的潜在后果。 谈论过不赞成使用JDK 9中的终结器时 ,我的观点是,多年来我一直未曾想到的一个主题突然在我身边。
Connolly的帖子引用了Hadoop JIRA HDFS-8562 (“ HDFS性能受FileInputStream Finalizer影响”)。 该JIRA于2015年6月开放,其描述包括有趣的背景,说明FileInputStream
的终结器为何会导致使用HDFS的用户FileInputStream
问题。 该JIRA也很有趣,因为它说明了为什么不更改FileInputStream
和FileOutputStream
而不使用protected
finalize()
方法并不容易。
HDFS-8562中引用了JDK-8080225 (“ FileInputStream清理应该加以改进。”),它于2015年5月编写。它指出:“如果尚未关闭FIS,则FileInputStream依赖于终结处理来执行最终关闭。 这会导致GC额外工作,从而导致突发事件。 FileInputStreams的清理应尽早进行,并且不会增加GC的开销。” 艾伦·贝特曼(Alan Bateman)通过变通办法对此进行了评论,“通过使用Files.newInputStream可以轻松解决此问题。” 罗杰·里格斯(Roger Riggs)写道,要充分解决这个问题很困难,“由于未知/未知,有多少FIS / FOS子类可能依赖于覆盖或最终确定兼容性问题,这一点非常严重。 只有长期(多次发布)限制弃用或使覆盖无效,才有可能最终消除兼容性问题。”
Connolly在文章结尾提到Jenkins通过JENKINS-42934对此进行了更改(“避免使用新的FileInputStream /新的FileOutputStream”)。 那里提供了将new FileInputStream
更改为Files.newInputStream
的示例。
即使使用了FileInputStream
类的类,我已经能够使用Java多年而不必担心终结器了,这一事实证明,就其本身而言,这些类与finalize()
实现的有限使用并不一定会导致垃圾收集或其他问题。 我喜欢Colin P. McCabe在HDFS JIRA上阐明此问题的方式:“虽然确实在许多地方都使用FileInputStream / FileOutputStream,但这些地方中的大多数都有短暂的对象或仅使用很少的对象。 就像我之前提到的,终结器遇到的最大问题是短路读取流缓存。 如果我们能够解决此补丁程序试图解决的问题,那么我们将解决大多数问题。” 换句话说,并非所有对FileInputStream
和FileOutputStream
都引起关注。 使用工具来确定与终结器相关的异常高的垃圾收集是确定需要解决的最佳方法。
多年来的Java开发,我都没有使用过Java终结器。 近几个月来,这已经成为一个问题,我看到越来越多的人正在处理这个问题。 弃用Java终结器是从核心API中删除它的第一步。
翻译自: https://www.javacodegeeks.com/2017/04/java-finalizer-java-file-inputoutput-streams.html
Java Finalizer和Java文件输入/输出流相关推荐
- java输出流输入流的使用_Java中的IO流之文件输入输出流
Java中的IO流之文件输入输出流 1.文件流介绍 文件流是以字节为单位进行读写文件的,所以属于字节流,并且是低级流.文件流位于java.io包下. 输入输出流分别是FileInputSteam和Fi ...
- 1.6 Java字节流的使用:字节输入/输出流、文件输入/输出流、字节数组输入/输出流
InputStream 是 Java 所有字节输入流类的父类, OutputStream 是 Java 所有字节输出流类的父类, 它们都是一个抽象类,因此继承它们的子类要重新定义父类中的抽象方法. 下 ...
- Java中IO流,输入输出流概述与总结(转载自别先生文章)
Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...
- 一只大二狗的Android历程--文件输入输出流 SharedPreference
2017年2月28日 5:10 PM 上篇博文中写道,这次要学习数据的存储完善那个角色软件,结果在XML解析上卡了壳,看了N多论坛示例代码无奈总是执行不出来,没办法为了不拖慢进度只能继续往下学习, 这 ...
- C++学习笔记-第7单元-文件输入输出流
C++学习笔记-第7单元 文章目录 C++学习笔记-第7单元 第7单元 文件输入输出流 单元导读 7.1 [C++17]文件系统 7.1.1 C++17的文件系统库简介 7.1.2 路径类及操作 7. ...
- 字节输入输出流,文件输入输出流
1.字节输入输出流 1.1 字节输入流 InputStream 类及其子类的对象表示字节输入流,InputStream 类的常用子类如下. ByteArrayInputStream 类:将字节数组转换 ...
- C++文件输入/输出流类
文章目录 文件输入/输出流类 表5: 文件读写模式 表6:ios_base 标识的组合意义 ofstream:写入文件的流类 例8:输出文本文件 例9:输出二进制文件 ifstream:从文件中读取的 ...
- php 输入 输出,php的文件输入输出流php://input
原标题: php的文件输入输出流php://input PHP输入流php://input 在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_ ...
- java 对象读写_java 对象输入输出流读写文件的操作实例
java 对象输入输出流读写文件的操作实例 java 支持对对象的读写操作,所操作的对象必须实现Serializable接口. 实例代码: package vo; import java.io.Ser ...
- java 之文件输入输出流
1. 使用文件字符输出流将一段文字存入文件,然后使用输入流读取文件中的内容. package s1;import java.io.*; public class DuFile {public stat ...
最新文章
- 深度学习技术在脑机接口中的应用
- 从零开始学习OpenCL开发(一)架构
- 2010年5月22日 网络规划师下午II 试题预测和论文预测
- expected at least 1 bean which qualifies as autowire candidate. Dependency a...
- [C++]Linux之C编程异常[true未定义解决方案]
- python 3.7 replace函数的坑
- 理解JavaScript的宏微任务
- CentOS 大量的TIME_WAIT解决方法
- C# MD5加密与解密
- Linux查看、处理文件方法
- ultraedit 运行的是试用模式_原来用Unittest框架写接口测试用例这么简单!
- Docker安装ik分词器
- Unity3d进阶学习(9)-- 本地化Localization
- 支付宝内部功能调用APP的said说明
- 获取属性配置config文件
- ACL技术,NAT技术,园区网组网
- 遍历$.each()和$().each()用法
- Webyog Sqlyog Ultimate_12.5.1最新版完美破解(带注册码)
- C语言表达式是运算符和,C语言之运算符和表达式
- Redis 一篇足以
热门文章
- 汇编语言(十三)之偶数转成哥德巴赫猜想
- 厉害了,Servlet3的异步处理机制
- Servlet之Tomcat配置与启动(一)
- 02-MyBatis配置SQL打印
- 《朝花夕拾》金句摘抄(五)
- ssh报错java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to org.service.impl.EmpServi
- 集成SpringSecurity---SpringBoot
- css 图片换行_好程序员web前端学习路线分享CSS浮动-文档流篇
- rpa文件怎么提取内容_怎么编辑pdf文件内容?有什么软件可以编辑pdf文件吗?
- hadoop2.6.0+eclipse配置