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也很有趣,因为它说明了为什么不更改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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 运行main_使用maven运行Java Main的三种方法解析

maven使用exec插件运行java main方法,以下是3种不同的操作方式。一、从命令行运行1、运行前先编译代码,exec:java不会自动编译代码,你需要手动执行mvn compile来完成编译。mvn compile2、编译完成后,执行exec运行main方…

CentOS7 修复boot目录

这里为了达到实验目的,首先删除boot目录下所有内容 重启后发现系统进不去了,这正是我们想要的 进入系统救援模式,以重新引导系统 进入救援模式后,输入以下命令进行修复boot目录 重启后,能正常引导系统了 转载于:https:…

java corepoolsize_理解ThreadPoolExecutor线程池的corePoolSize、maximumPoolSize和poolSize

我们知道,受限于硬件、内存和性能,我们不可能无限制的创建任意数量的线程,因为每一台机器允许的最大线程是一个有界值。也就是说ThreadPoolExecutor管理的线程数量是有界的。线程池就是用这些有限个数的线程,去执行提交的任务。然…

开式蓄冷罐与闭式蓄冷罐_一罐来统治所有人

开式蓄冷罐与闭式蓄冷罐跳下内存通道 早在1998年,当我是一名C / C 开发人员时,尝试使用Java时,有关该语言的一些内容对我来说就显得有些恼火了。 我记得很担心这些 为什么没有合适的编辑器呢? C / C 有很多。 我为Java拥有的只是…

嵊州D5T2 折纸 folding

折纸 folding 【问题描述】 在非常紧张的 NOIP 考试中,有人喜欢啃指甲,有人喜欢转铅笔,有人喜欢撕 纸条,……而小 x 喜欢迷折纸。 现有一个 W * H 的矩形纸张,监考老师想知道,小 x 至少要折多少次才能使 矩…

使用Portworx和Couchbase的有状态容器

容器本应是短暂的,因此可以很好地扩展以用于无状态应用程序。 有状态的容器(例如Couchbase)需要区别对待。 管理Docker容器的持久性概述了如何管理有状态容器的持久性。 该博客将说明如何使用Docker Volume Plugins和Portworx创建有状态的容…

java和jvm_java 和 JVM

C和Java的区别指针:java中不存在指针的概念,编程者无法直接通过指针来直接访问内存,有利于维护java程序的安全多重继承:C支持多重继承,java不支持多重继承,但是允许一个类继承多个接口来实现多重继承的问题…

Redis 集群_主从复制_哨兵模型

1 redis集群简介 1.1 集群的概念 所谓的集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态。 1.1.1 使用redis集群的必要性 问题:我们已经部署好了redis,并且能启动一个redis&#…

java 7 update 17_Java version 7, Update 17 is NOT recongnized by FireFox version 19.0.2

选择的解决方案Reply to my own post:Out of all the solutions posted regarding Java install problems, I gleaned one thing: A re-install of Java and a re-install of Firefox may well solve the problem.Well, for me, thus far, it has.The simple steps I followed:…

英语中的国籍,国家和地区

英语中对于国籍,国家的表述是不一样的,我时常迷糊于此。前些日子我发现了一本英语奇书《Practical English Usage》,这本书回答了我许多英语中的疑问。下面的内容也就是将该书的第364条抄一下。 1,Introduction In order to refer…

junit测试方法_JUnit测试方法订购

junit测试方法直到版本4.10为止的Junit都使用反射API返回的测试类中测试方法的顺序作为测试方法执行的顺序– Class.getMethods() 。 引用getMethods()api的Javadoc: 返回的数组中的元素未排序,并且没有任…

java非阻塞锁_Java并发问题的非阻塞解决方案

转自http://blog.csdn.net/u011277203/article/details/9223545在并发环境中,对于共享资源通常会采用显式的锁机制(比如synchronized或ReentrantLock)来保证在任意时刻只会有一条线程访问这些变量,并且这些变量的修改对随后获取锁的线程是可见的。无法获…

Java垃圾收集器:G1GC何时将CMS强制退出?

在针对JDK 9(2017/4/4)提出的JEP中 , Mark Reinhold写道JEP 291 (“弃用并发标记扫描(CMS)垃圾收集器”)是“已被放入“建议的在讨论和审查后,由所有者将其定位为目标”。 如果JEP 2…

模块简介/模块的导入/模块的查找顺序/绝对导入和相对导入/软件开发目录规范...

一.模块的简介 什么是模块: 模块就是一系列功能的结合体 模块的三种来源: 1.内置的 2.第三方的  3.自定义的 模块的四种表现形式: 1.使用python编写的py文件(也就意味着py文件也可以称之为模块:一个py文件也可以称之为一个模块)(***)    2.已被编译为共享库或DLL的C或C扩展…

java dll 乱码_java调用c++ dll出现中文乱码 | 学步园

最近的开发用到了使用java调用本机动态连接库的功能,将文件路径通过java调用C代码对文件进行操作。在调用中如果路径中包含有中文字符就会出现问题,程序运行就会中止。下面用一个小例子,来说明记录下解决的方法。java中传入一个字符串&#x…

每日一问:Android 滑动冲突,你们都是怎样处理的

坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过。 在 Android 开发中,滑动冲突总是我们一个无法避免的话题。而对于解决方案却是众说纷纭。比…

java多线程 cpu分配_java多线程总结(转载)

Java 多线程编程总结-------------------------------------------------------------------------------------------------下面的内容是很早之前写的,内容不够充实,而且是基于Java1.4的内容,Java5之后,线程并发部分扩展了相当多…

java设计模式迭代器模式_迭代器模式和Java

java设计模式迭代器模式大家好,在本文中,我们将检查Iterator Pattern 。 我知道你们中许多人已经使用过一种设计模式,但是也许您没有意识到它是模式,或者不知道它的巨大价值。 根据《 Head First Design 》一书: 迭代…

笔记_SQLite入门

1、SQLite是什么? QLite没有单独的服务器进程。 它直接读取和写入普通磁盘文件。 具有多个表,索引,触发器和视图的完整SQL数据库包含在单个磁盘文件中。2、SQLite语法 区分大小写: SQLite不区分大小写。但是,有一些区分…

java线程提交_从Java线程到线程池

线程模型线程模型分为两类,用户级线程(ULT)和内核级线程(KLT)用户级线程(ULT):user level threads,系统内核对ULT无感知,线程的创建和调度都由用户级APP进程管理;即APP自行管理的线程,就是用户级线程内核级…