【问题标题】:Java out of memory error when doing substring on extremely large strings在非常大的字符串上执行子字符串时出现 Java 内存不足错误
【发布时间】: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


【解决方案1】:

我认为以下方法会更好。

str = s.substring( i,i+k ).intern() ; 先删除new String 部分,然后将String str 移出循环。我们需要确保从subString 返回的字符串是唯一的。 使用intern 使Java 重用相同的字符串。不过要注意。使用 intern 会减慢您的代码速度。

虽然这样会节省内存。

【讨论】:

  • 这段代码不会产生重复的字符串(除了短命的)结果实习生操作没有效果
  • 这是我能想到的最佳优化。
【解决方案2】:

这一行

String str = new String( s.substring( i,i+k ) );

导致内存泄漏。您应该避免在循环内进行实例化。

【讨论】:

    【解决方案3】:

    也许你在说:

    时使用了一个无效的假设:

    您可以假设它足够大,例如超过 64gb。问题出在代码上。

    地图中有多少条目以及它们在爆炸时的大小。尝试添加一些调试代码,例如:

    if (map.size() % 50000 == 0) {
                System.out.println(map.size());
    }
    

    并发布更多信息。输入字符串的大小、子字符串的大小、最后报告的结果以及正在使用的 Xmx 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多