gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:07:37 25 4
gpt4 key购买 nike

所以。我试过:

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

我也尝试过:

String.join("\n", buffer)

我正在内存超过 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)

最佳答案

您无法创建包含那么多字符的字符串。 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;

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

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

关于java - 在 Java 中加入字符串列表时出现 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52712321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com