我有一塊混雜着Scala代碼的複雜Java代碼,它讀入輸入文件,並在逐行處理行時創建大量數據結構,包括輸入中長度最大爲10的所有子字符串的散列表。Java在產生OutOfMemory錯誤之前等待了20個小時?
我最初使用-Xmx4g
開關運行代碼,代碼花費了20小時,然後才返回OOM錯誤,但沒有完成整個文件。
然後我運行代碼-Xmx32g
,代碼處理文件中的所有行,並在8分鐘內,然後繼續處理讀取的數據結構。 8分鐘後,Java使用的駐留內存大約爲21GB。
我的問題是:爲什麼Java在8分鐘內沒有返回OOM錯誤?它在20小時內做了什麼?
不斷垃圾收集。 – 2014-09-27 19:54:44
'String.substring()'的內存消耗高度依賴於Java版本(在1.7.0_06之前或之後),以及您的子字符串是否覆蓋原始字符串的大部分或僅包含原始字符串的一小部分。 Pre'1.7.0_06'子字符串由原始字符串的相同char []支持 - 整個字符串保留在內存中,但是被所有子字符串共享。用'1.7.0_06'子串創建新的字符數組。 – 2014-09-27 21:49:37
@FabianBarney:我想知道他們爲什麼這麼做。舊的方法似乎更明智。 – 2014-09-27 22:35:09