finalizer_Java Finalizer和Java文件输入/输出流
finalizer
在與主題直接合作或花時(shí)間學(xué)習(xí)它們之后,我經(jīng)常會發(fā)現(xiàn)自己在網(wǎng)上注意到更多主題。 最近的Stephen Connolly ( CloudBees )發(fā)表了FileInputStream / FileOutputStream被認(rèn)為有害的文章,引起了我的注意,因?yàn)槲易罱龅搅薐ava終結(jié)器的 問題 。 在那篇文章中 ,作者討論了java.io.FileInputStream和java.io.FileOutputStream實(shí)現(xiàn)覆蓋的finalize()方法FileInputStream.finalize()和FileOutputStream.finalize()的潛在后果。 談到棄用JDK 9中的終結(jié)器 ,我的觀點(diǎn)是,多年來我一直未曾想到的一個(gè)主題突然在我身邊。
Connolly的帖子引用了Hadoop JIRA HDFS-8562 (“ HDFS性能受FileInputStream Finalizer影響”)。 該JIRA于2015年6月開放,其描述包括有趣的背景,說明FileInputStream的終結(jié)器為何會導(dǎo)致使用HDFS的用戶FileInputStream問題。 這個(gè)JIRA也很有趣,因?yàn)樗f明了為什么不更改FileInputStream和FileOutputStream而不使用protected finalize()方法并不容易。
HDFS-8562中引用了JDK-8080225 (“ FileInputStream清理應(yīng)該加以改進(jìn)。”),它于2015年5月編寫。它指出:“如果尚未關(guān)閉FIS,則FileInputStream依賴于終結(jié)處理來執(zhí)行最終關(guān)閉。 這會導(dǎo)致發(fā)生突發(fā)的GC的額外工作。 FileInputStreams的清理應(yīng)盡早進(jìn)行,并且不會增加GC的開銷。” 艾倫·貝特曼(Alan Bateman)通過變通辦法對此進(jìn)行了評論,“通過使用Files.newInputStream可以輕松解決此問題。” 羅杰·里格斯(Roger Riggs)寫道,要充分解決這個(gè)問題是很困難的,“由于未知/未知,有多少FIS / FOS子類可能依賴于重寫或最終確定兼容性問題,這一點(diǎn)非常嚴(yán)重。 只有長期(多次發(fā)布)限制以棄用或使覆蓋無效,才有可能最終消除兼容性問題。”
Connolly在文章結(jié)尾引用了Jenkins通過JENKINS-42934進(jìn)行的更改 (“避免使用新的FileInputStream /新的FileOutputStream”)。 在那里提供了將new FileInputStream更改為Files.newInputStream的示例。
即使使用了FileInputStream類的類,我已經(jīng)能夠使用Java多年而不必?fù)?dān)心終結(jié)器了,這一事實(shí)證明,就其本身而言,這些類與finalize()實(shí)現(xiàn)的有限使用并不一定會導(dǎo)致垃圾收集或其他問題。 我喜歡Colin P. McCabe在HDFS JIRA中闡明此問題的方式:“雖然確實(shí)在許多地方都使用FileInputStream / FileOutputStream,但這些地方中的大多數(shù)都有短暫的對象或僅使用很少的對象。 就像我之前提到的,終結(jié)器遇到的最大問題是短路讀取流緩存。 如果我們能夠解決此補(bǔ)丁程序試圖解決的問題,那么我們將解決大多數(shù)問題。” 換句話說,并非所有對FileInputStream和FileOutputStream都引起關(guān)注。 使用工具識別與終結(jié)器相關(guān)的異常高的垃圾收集是識別需要解決的垃圾的最佳方法。
多年來的Java開發(fā),我都沒有使用過Java終結(jié)器。 近幾個(gè)月來,這已經(jīng)成為一個(gè)問題,我看到越來越多的人正在處理。 淘汰Java終結(jié)器是將其從核心API中刪除的一個(gè)很好的第一步。
翻譯自: https://www.javacodegeeks.com/2017/04/java-finalizer-java-file-inputoutput-streams.html
finalizer
總結(jié)
以上是生活随笔為你收集整理的finalizer_Java Finalizer和Java文件输入/输出流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos是利用什么攻击的(ddos是利用
- 下一篇: java登录界面命令_Java命令行界面