jdk8读取文件_JDK 7和JDK 8中大行读取速度较慢的原因
jdk8讀取文件
我早些時候發布了博客文章Reading Large Lines Slower in JDK 7和JDK 8,并且在描述該問題的文章上有一些有用的評論 。 這篇文章提供了更多解釋,說明為何該文章中演示的文件讀取(并由Ant的LineContainsRegExp使用 )在Java 7和Java 8中比在Java 6中這么慢。
X Wang的帖子JDK 6和JDK 7中的substring()方法描述了如何在JDK 6和JDK 7之間更改String.substring() 。Wang在該帖子中寫道,JDK 6 substring() “創建了一個新字符串,但字符串的值仍指向堆中相同的[backing char]數組。” 他與JDK 7方法形成對比,“在JDK 7中,substring()方法實際上在堆中創建了一個新數組。”
Wang的帖子對于理解Java 6和Java 7之間String.substring()的區別非常有用。對該帖子的評論也很有見地。 這些評論包括我很欣賞的觀點 ,“我會說'不同'而不是'改善'。” 也有關于JDK 7如何避免 JDK 6中可能發生的潛在內存泄漏的解釋 。
StackOverflow線程Java 7字符串–子字符串的復雜性解釋了更改的動機,并引用了JDK-4513622錯誤:(str)保留字段的子字符串會阻止對象的GC 。 該錯誤指出:“ [發生OutOfMemory錯誤,因為如果調用者在對象中存儲字段的子字符串,則對象不會被垃圾回收。” 該錯誤包含演示此錯誤發生的示例代碼。 我在這里修改了該代碼:
/*** Minimally adapted from Bug JDK-4513622.** {@link http://bugs.java.com/view_bug.do?bug_id=4513622}*/ public class TestGC {private String largeString = new String(new byte[100000]);private String getString(){return this.largeString.substring(0,2);}public static void main(String[] args){java.util.ArrayList<String> list = new java.util.ArrayList<String>();for (int i = 0; i < 1000000; i++){final TestGC gc = new TestGC();list.add(gc.getString());}} }下一個屏幕快照演示了用Java 6(jdk1.6是可執行Java啟動程序路徑的一部分)和Java 8(主機上的默認版本)執行的最后一個代碼段(從Bug JDK-4513622改編而成)。 如屏幕快照所示,在Java 6中運行代碼時拋出OutOfMemoryError ,而在Java 8中運行時不拋出OutOfMemoryError 。
換句話說,當對冗長的Java字符串執行String.substring時,Java 7中的更改修復了潛在的內存泄漏,但以性能影響為代價。 這意味著使用String.substring (包括Ant的LineContainsRegExp)來處理很長的行的任何實現都可能需要更改以不同的方式實現,或者在從Java 6遷移到Java 7或更高版本時處理很長的行時應避免使用。
一旦知道了問題(在這種情況下更改String.substring實現),就可以更輕松地在線找到有關正在發生的事情的文檔(感謝提供了使這些資源易于查找的注釋)。 JDK-4513622的重復錯誤包含提供額外詳細信息的內容。 這些錯誤是JDK-4637640:由于String.substring()實現而導致的內存泄漏和JDK-6294060:使用substring()導致了內存泄漏 。 其他相關的在線資源包括Java 7中對String.substring的更改 (其中包括對String.intern()的引用-有更好的方法 ), Java 6與Java 7:當實現很重要時 ,以及受到高度評價(超過350條注釋) Reddit線程TIL Oracle更改了Java 7 Update 6中的內部String表示,從而將子字符串方法的運行時間從常量更改為N。
用Java 1.7.0_06編寫的“更改為String內部表示形式”一文很好地回顧了此更改,并總結了原始問題,修復程序以及與該修復程序相關的新問題:
現在您可以忘記上面描述的內存泄漏,并且永遠不再使用新的String(String)構造函數。 缺點是,您現在必須記住String.substring現在具有線性復雜度,而不是恒定的復雜度。
翻譯自: https://www.javacodegeeks.com/2015/01/reason-for-slower-reading-of-large-lines-in-jdk-7-and-jdk-8.html
jdk8讀取文件
總結
以上是生活随笔為你收集整理的jdk8读取文件_JDK 7和JDK 8中大行读取速度较慢的原因的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 物业居民备案管理办法(物业居民备案)
- 下一篇: 搜狗输入linux(搜狗输入 linux