StringBuilder.append() 中的 OutOfMemoryError 即使有足够的内存

OutOfMemoryError in StringBuilder.append() even with more than enough 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]

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