如何使用StringBuilder在循环中避免Java OutofMemoryError堆空间?

时间:2017-06-06 20:43:40

标签: java

以下是抛出java.lang.OutOfMemoryError: Java heap space的代码:

StringBuilder sb = new StringBuilder();
    for (int i = 0; i< ranks.size(); i++) {
        Map<String, String> map = ranks.get(i);
        sb.append("SELECT ");
        int iter = 0;
        for (String key : map.keySet()) {
            if (key.equals("ware_md5")) {
                sb.append("'").append(map.get(key)).append(" ' AS ").append(key);
            }
            else {
                sb.append(map.get(key)).append(" AS ").append(key);
            }
            if (iter < map.keySet().size() - 1) {
                sb.append(",");
            }
            iter++;
        }
        if (i < ranks.size() - 1) {
            sb.append(" UNION ALL ");
        }

    }
    return sb.toString();

'rank'ArrayList包含大约30 000个值

有没有办法重写这段代码以避免此错误?

2 个答案:

答案 0 :(得分:4)

使用更大的堆启动JVM。以java -Xmx256M为例,对于256MB堆的示例。

答案 1 :(得分:1)

  • 更多内存是最简单的解决方案,已经给出了
  • new StringBuilder(100_000) - 至少更快
  • AS key不需要,但是对于第一个工会。
  • 请注意,您需要SortedMap:密钥始终采用相同的顺序。
  • 消费ranks.get(i)