finalizer

在与主题直接合作或花时间学习它们之后,我经常会发现自己在网上注意到更多主题。 最近的Stephen Connolly ( CloudBees )发表了FileInputStream / FileOutputStream被认为有害的文章,引起了我的注意,因为我最近遇到了Java终结器的 问题 。 在那篇文章中 ,作者讨论了java.io.FileInputStream和java.io.FileOutputStream实现覆盖的finalize()方法FileInputStream.finalize()和FileOutputStream.finalize()的潜在后果。 谈到弃用JDK 9中的终结器 ,我的观点是,多年来我一直未曾想到的一个主题突然在我身边。

Connolly的帖子引用了Hadoop JIRA HDFS-8562 (“ HDFS性能受FileInputStream Finalizer影响”)。 该JIRA于2015年6月开放,其描述包括有趣的背景,说明FileInputStream的终结器为何会导致使用HDFS的用户FileInputStream问题。 这个JIRA也很有趣,因为它说明了为什么不更改FileInputStreamFileOutputStream而不使用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,但这些地方中的大多数都有短暂的对象或仅使用很少的对象。 就像我之前提到的,终结器遇到的最大问题是短路读取流缓存。 如果我们能够解决此补丁程序试图解决的问题,那么我们将解决大多数问题。” 换句话说,并非所有对FileInputStreamFileOutputStream都引起关注。 使用工具识别与终结器相关的异常高的垃圾收集是识别需要解决的垃圾的最佳方法。

多年来的Java开发,我都没有使用过Java终结器。 近几个月来,这已经成为一个问题,我看到越来越多的人正在处理。 淘汰Java终结器是将其从核心API中删除的一个很好的第一步。

翻译自: https://www.javacodegeeks.com/2017/04/java-finalizer-java-file-inputoutput-streams.html

finalizer

finalizer_Java Finalizer和Java文件输入/输出流相关推荐

  1. Java Finalizer和Java文件输入/输出流

    在与主题直接合作或花时间学习它们之后,我经常会发现自己在网上注意到更多主题. 最近的Stephen Connolly ( CloudBees )发表FileInputStream / FileOutp ...

  2. java 输入流可以合并吗_HOW2J Java 文件输入输出流,合并与拆分

    //需要所指目录下确有一个文件供拆分 //多余的另成一个文件 package File; import java.util.*; import java.io.*; public class Test ...

  3. Java 文件输入输出流 实验题

    实验一: 目录 1.分析成绩单.现有如下格式的成绩单(文本格式)score.txt: 2. 统计英语单词.使用Scanner类和正则表达式统计一篇英文中的单词 3. 读取压缩文件.找一个压缩文件,如b ...

  4. java输出流输入流的使用_Java中的IO流之文件输入输出流

    Java中的IO流之文件输入输出流 1.文件流介绍 文件流是以字节为单位进行读写文件的,所以属于字节流,并且是低级流.文件流位于java.io包下. 输入输出流分别是FileInputSteam和Fi ...

  5. 1.6 Java字节流的使用:字节输入/输出流、文件输入/输出流、字节数组输入/输出流

    InputStream 是 Java 所有字节输入流类的父类, OutputStream 是 Java 所有字节输出流类的父类, 它们都是一个抽象类,因此继承它们的子类要重新定义父类中的抽象方法. 下 ...

  6. Java之输入输出流(文件的读写)

    Java之输入输出流(文件的读写) 首先,在编程的世界,流明显显得很重要.C++的输入输出流,Java的输入输出流等等. 首先我们得学会如何使用Java的输入输出流.首先,它们被封装在Java的一个叫 ...

  7. 一只大二狗的Android历程--文件输入输出流 SharedPreference

    2017年2月28日 5:10 PM 上篇博文中写道,这次要学习数据的存储完善那个角色软件,结果在XML解析上卡了壳,看了N多论坛示例代码无奈总是执行不出来,没办法为了不拖慢进度只能继续往下学习, 这 ...

  8. Java高效输入输出流讲解

    Java高效输入输出流讲解 Java中执行输出和输入操作,需要通过IO流.例如最常见的System.out.println()就是一个输出流.IO流的类比较多,但核心体系就是由File. InputS ...

  9. C++学习笔记-第7单元-文件输入输出流

    C++学习笔记-第7单元 文章目录 C++学习笔记-第7单元 第7单元 文件输入输出流 单元导读 7.1 [C++17]文件系统 7.1.1 C++17的文件系统库简介 7.1.2 路径类及操作 7. ...

最新文章

  1. MongoDB的查询整理
  2. Thread的start()和join()方法
  3. JDBC query VARRAY on DB level
  4. java 邮件模板_Spring Boot 2发送邮件手把手图文教程
  5. jsp网页实现自动刷新和自动跳转页面
  6. java闰年满五换行_CoreJava练习题
  7. 功能表单之人员构造器字段类型详解—JEPLUS软件快速开发平台
  8. Windows核心编程_LOG软件
  9. http性能测试点滴
  10. nanopc t3开发板系统烧录_基础教程18 定制 Arduino 系统
  11. {基于Applet的J2ME模拟器}和{microemulator}[J2ME推荐]
  12. 百度云OCR身份证识别
  13. FPGA智能网卡-HairPin功能
  14. Java一键生成PDF合同以及骑缝章、盖章处的精准盖章
  15. ttl转rs232发送十六进制_浅析 UART、RS232、TTL 之间的关系(转)
  16. pc版qq登录及移动版qq登录的申请过程
  17. php file_put_contents 根目录权限,关于php:file_put_contents权限被拒绝
  18. matlab syms函数例题,matlab函数计算syms f o s z k D t m q T x;p=f-o-(s-o)*(1-erf(0.5*
  19. 天梯练习题(C语言版)
  20. leetcode专题训练 77. Combinations

热门文章

  1. YbtOJ-染色计划【树链剖分,线段树,tarjan】
  2. AT4996-[AGC034F]RNG and XOR【FWT,生成函数】
  3. P6257-[ICPC2019 WF]First of Her Name【AC自动机】
  4. P2827-蚯蚓【队列】
  5. jzoj3914-人品问题【树形dp】
  6. nssl1141,jzoj3470-最短路【SPFA,暴力】
  7. 【做题记录】CF1444A Division
  8. 2021牛客暑期多校训练营5 E-Eert Esiwtib(树形dp+位运算)
  9. 【动态规划】农田个数 (ssl 1633)
  10. 【动态规划】书的复制 (ssl 1203)