StringBuilder.append()中的OutOfMemoryError甚至有足够的内存

Lak*_*ula 1 java stringbuilder out-of-memory

即使将内存大小设置为32 GB并仅将500 MB文件读入构建器,我也会从java.lang.StringBuilder.append中收到OutOfMemoryError。

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

Lak*_*ula 5

发生这种情况是因为StringBuilder要分配的字节数组将需要比JVM允许的更大的数组大小(超过2147483647个aka Integer.MAX_VALUE元素)。