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

时间:2018-10-09 02:00:55

标签: java out-of-memory

所以。我尝试过:

findOne()

而且我也尝试过:

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

我正在将大于100GB的系统上的大文件(小于10GB)加入内存。以下是堆栈跟踪。我该如何解决这个问题?

String.join("\n", buffer)

2 个答案:

答案 0 :(得分:9)

您不能创建具有这么多字符的字符串。 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;

您根本无法创建大于该值的字符串。

为什么要在将文件流式传输到磁盘时可以将它们加入内存中,为什么要加入这些文件?

答案 1 :(得分:0)

首先,可能不建议使用那么多的内存,我会将其分解为合理大小的块(也许一次连接100个字符串,然后写入文件)。如果确实必须使用那么多的内存,则需要将-Xmx10G传递给JVM。这样会分配更多堆空间供Java使用。