代码之家  ›  专栏  ›  技术社区  ›  Aditya

在Java中加入字符串列表时发生OutOfMemoryError

  •  1
  • Aditya  · 技术社区  · 6 年前

    所以。我试过:

    StringBuilder sb = new StringBuilder();
    for(String bufferItem: buffer){
        sb.append(bufferItem);
    }
    

    我也试过:

    String.join("\n", buffer)
    

    Exception in thread "main" java.lang.OutOfMemoryError
        at java.lang.AbstractStringBuilder.hugeCapacity(AbstractStringBuilder.java:161)
        at java.lang.AbstractStringBuilder.newCapacity(AbstractStringBuilder.java:155)
        at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:125)
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
        at java.lang.StringBuilder.append(StringBuilder.java:136)
        at java.lang.StringBuilder.append(StringBuilder.java:76)
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:484)
        at java.lang.StringBuilder.append(StringBuilder.java:166)
        at java.util.StringJoiner.add(StringJoiner.java:185)
        at java.lang.String.join(String.java:2504)
    
    2 回复  |  直到 6 年前
        1
  •  12
  •   Erwin Bolwidt    6 年前

    不能用那么多字符创建字符串。这个 OutOfMemoryError

    最大可能的大小定义为2到31的幂,减去1,减去8。如果在文件中只使用单字节字符,则大约为2Gb。见来源 AbstractStringBuilder .

    /**
     * The maximum size of array to allocate (unless necessary).
     * Some VMs reserve some header words in an array.
     * Attempts to allocate larger arrays may result in
     * OutOfMemoryError: Requested array size exceeds VM limit
     */
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    

    你不能创建比这个更大的字符串。

        2
  •  -1
  •   HackerBoss    6 年前

    首先,可能不建议使用那么多内存,我会将其分成大小合理的块(可能一次连接100个字符串,然后写入一个文件)。如果你真的要用那么多的内存,那么你就需要通过考试 -Xmx10G