所以。我尝试过:
findOne()
而且我也尝试过:
StringBuilder sb = new StringBuilder();
for(String bufferItem: buffer){
sb.append(bufferItem);
}
我正在将大于100GB的系统上的大文件(小于10GB)加入内存。以下是堆栈跟踪。我该如何解决这个问题?
String.join("\n", buffer)
答案 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使用。