在Java中加入字符串列表时出现OutOfMemoryError

Adi*_*tya 2 java out-of-memory

所以.我试过了:

StringBuilder sb = new StringBuilder();
for(String bufferItem: buffer){
    sb.append(bufferItem);
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

String.join("\n", buffer)
Run Code Online (Sandbox Code Playgroud)

我在超过100GB的系统上加入内存中的大文件(10GB以下).以下是堆栈跟踪.我怎么解决这个问题?

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)
Run Code Online (Sandbox Code Playgroud)

Erw*_*idt 10

您无法使用那么多字符创建字符串.这OutOfMemoryError不是因为堆已满,而是因为您正在尝试构建大于最大可能大小的String.

最大可能的大小定义为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;
Run Code Online (Sandbox Code Playgroud)

你根本无法创建比这更大的字符串.

当你将它们连接到磁盘时,为什么要加入这些文件?