【发布时间】:2016-05-05 09:37:38
【问题描述】:
当输入字符串太长(长度> 200,000)时,以下方法会引发异常。问题似乎与 substring() 的使用有关,在查看了其他一些帖子后,我将用法更改为 String str = new String( s.substring( i,i+k ) ); 但问题仍然存在...知道为什么仍然抛出 memoery 异常吗? (我不想增加堆大小)
方法:
private static Map<String,Integer> findSubString(String s, int k) {
Map<String,Integer> map = new HashMap<>( );
for (int i = 0; i < s.length() - (k - 1); i++) {
String str = new String( s.substring( i,i+k ) );
if (map.containsKey( str )) {
map.put( str, map.get( str ) + 1 );
}
else {
map.put( str, 1 );
}
}
return map;
}
错误:
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3664)
at java.lang.String.<init>(String.java:207)
at java.lang.String.substring(String.java:1969)
at Solution.findSubString(Solution.java:112)
【问题讨论】:
-
XmX 的值是多少?
-
您可以假设它足够大,例如超过 64gb。问题出在代码上。
-
版本是Java8。
-
我玩了一点,只能用 XmX 重现 16mb 附近的 200000 长度字符串和 2-8 范围内的 k。我认为这段代码没有问题。字符串需要空间,映射条目需要空间。没有内存韭菜或smth。
-
@AdamSkywalker 非常感谢您的努力。很高兴知道这段代码已经过优化,这意味着我解决问题的方法是错误的。
标签: java string out-of-memory heap-memory