我有一块混杂着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