【发布时间】:2018-01-03 16:53:08
【问题描述】:
这是对我们已经切换到 1.8 后导致问题的一些生成代码的提炼。
谁能帮助解释为什么它在 Java 1.6 中编译和运行,但在 1.8 中导致内存不足错误?此外,如果您注释掉 set.add(s1) 行,它似乎在 1.8 中运行良好。
我很确定这不是因为我将 5 个字符的子字符串存储在一个集合中。它应该能够处理其中的 12,000 个。另外,它在 1.6 中有效,即使我将行更改为 set.add(new String(s1)) 或 set.add(s1 + " ") 以尝试强制创建新字符串。
package put.your.package.here;
import java.util.HashSet;
import java.util.Set;
public class SubstringTest {
public static void main(String[] args) {
String s = buildArbitraryString();
System.out.println(System.getProperty("java.version") + "::" + s.length());
Set<String> set = new HashSet<String>();
while (s.length() > 0) {
s = whackString(s, set);
}
}
private static String whackString(String s, Set<String> set) {
String s1 = s.substring(0, 5);
String s2 = s.substring(5);
s = s2;
set.add(s1);
System.out.println(s1 + " :: " + set.size());
return s;
}
private static String buildArbitraryString() {
StringBuffer sb = new StringBuffer(60000);
for (int i = 0; i < 15000; i++)
sb.append(i);
String s = sb.toString();
return s;
}
}
有什么想法吗?
JVM 版本信息:
java.vm.name=IBM J9 VM
java.fullversion=
JRE 1.8.0 IBM J9 2.8 Windows 7 amd64-64 Compressed References 20160210_289934 (JIT enabled, AOT enabled)
J9VM - R28_Java8_SR2_20160210_1617_B289934
JIT - tr.r14.java_20151209_107110.04
GC - R28_Java8_SR2_20160210_1617_B289934_CMPRSS
J9CL - 20160210_289934
已编辑以添加 JVM 信息
【问题讨论】:
-
您使用的是哪个 JVM?它在 Hotspot VM 上对我来说很好。还有你的 JVM 启动参数是什么?请注意,
1.8中的某些参数(如 permgen 配置)已消失。 -
你从哪里来? stackoverflow.com/q/33893655/995891 会产生相当大的影响。
-
是时候启动堆分析器了。
-
使用
-XX:+HeapDumpOnOutOfMemoryError开关启动JVM,然后我建议尝试MAT。
标签: java string out-of-memory substring