Java StringBuilder.append()中的OutOfMemoryError即使内存不足

Java StringBuilder.append()中的OutOfMemoryError即使内存不足,java,out-of-memory,stringbuilder,Java,Out Of Memory,Stringbuilder,我从java.lang.StringBuilder.append中得到一个OutOfMemoryError,即使我将内存大小设置为32 GB,并且只在生成器中读取500 MB的文件 java.lang.OutOfMemoryError: null at java.base/java.lang.AbstractStringBuilder.hugeCapacity(AbstractStringBuilder.java:214) ~[na:na] at java.base/java.l

我从java.lang.StringBuilder.append中得到一个OutOfMemoryError,即使我将内存大小设置为32 GB,并且只在生成器中读取500 MB的文件

java.lang.OutOfMemoryError: null
    at java.base/java.lang.AbstractStringBuilder.hugeCapacity(AbstractStringBuilder.java:214) ~[na:na]
    at java.base/java.lang.AbstractStringBuilder.newCapacity(AbstractStringBuilder.java:206) ~[na:na]
    at java.base/java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:173) ~[na:na]
    at java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:538) ~[na:na]
    at java.base/java.lang.StringBuilder.append(StringBuilder.java:174) ~[na:na]
    at com.github.loa.indexer.service.index.base64.Base64Encoder.encode(Base64Encoder.java:31) ~[classes/:na]

这是因为StringBuilder要分配的字节数组需要比JVM允许的更大的数组大小超过2147483647 aka Integer.MAX_VALUE元素。

这是因为StringBuilder要分配的字节数组需要比JVM允许的更大的数组大小超过2147483647 aka Integer.MAX_VALUE元素。

最好添加代码片段,以获得更多关于发生了什么的上下文。我的用例非常复杂。尝试以3072字节长的块将文件流式传输到字节数组中,然后使用java.util.Base64对这些块进行编码,并将编码结果附加到StringBuilder。不幸的是,StringBuilder很快就死了。我需要将整个base64字符串放入内存,以将其发送到Elasticsearch。流式搜索不是一个选项。这里有代码:您运行的是什么版本的Java?@Andreas Java 11。我认为它是针对Java9+的,但不确定。他们抛出OOM有点草率。现在我需要在我的代码中的某个地方捕捉它,我知道,捕捉OOM是非常糟糕的。最好添加代码片段,以获得更多关于正在发生的事情的上下文。我的用例非常复杂。尝试以3072字节长的块将文件流式传输到字节数组中,然后使用java.util.Base64对这些块进行编码,并将编码结果附加到StringBuilder。不幸的是,StringBuilder很快就死了。我需要将整个base64字符串放入内存,以将其发送到Elasticsearch。流式搜索不是一个选项。这里有代码:您运行的是什么版本的Java?@Andreas Java 11。我认为它是针对Java9+的,但不确定。他们抛出OOM有点草率。现在我需要在我的代码中的某个地方捕捉它,我知道,捕捉OOM是非常糟糕的。换句话说,Java的一个限制是字符串的大小不能超过2GB,这通常意味着它不能超过10亿个字符。拉丁语1只有字符串在以后的Java版本中可以是20亿个字符。换句话说,Java的一个限制是字符串的大小不能超过2GB,这通常意味着它不能超过10亿个字符。在Java的更高版本中,只有字符串才能达到20亿个字符。