finalizer_Java Finalizer和Java文件输入/输出流
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也很有趣,因為它說明了為什么不更改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
finalizer
總結
以上是生活随笔為你收集整理的finalizer_Java Finalizer和Java文件输入/输出流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos是利用什么攻击的(ddos是利用
- 下一篇: 文广新局官网(文广备案)