0

在将 Base64 编码的字符串解码为字节数组时(必须这样做,因为我有一个可以作用于字节数组进行解密的密钥),我得到了 outOfMemory。处理这个问题的有效方法是什么?我是否应该将我的输入编码字符串分块为大小的分区,然后对其进行解码或任何其他有效的建议,请提出建议。

导致问题的代码。

byte[] encrypted = Base64.decodeBase64(strEncryptedEncodedData);

堆栈跟踪

DefaultQuartzScheduler_Worker-3
  at java.lang.OutOfMemoryError.<init>()V (OutOfMemoryError.java:48)
  at java.lang.StringCoding$StringEncoder.encode([CII)[B (StringCoding.java:300)
  at java.lang.StringCoding.encode(Ljava/lang/String;[CII)[B (StringCoding.java:344)
  at java.lang.String.getBytes(Ljava/lang/String;)[B (String.java:918)
  at org.apache.commons.codec.binary.StringUtils.getBytesUnchecked(Ljava/lang/String;Ljava/lang/String;)[B (StringUtils.java:156)
  at org.apache.commons.codec.binary.StringUtils.getBytesUtf8(Ljava/lang/String;)[B (StringUtils.java:129)
  at org.apache.commons.codec.binary.BaseNCodec.decode(Ljava/lang/String;)[B (BaseNCodec.java:306)
  at org.apache.commons.codec.binary.Base64.decodeBase64(Ljava/lang/String;)[B (Base64.java:669)

Eclipse 内存分析器内存使用情况:

在此处输入图像描述

Edit1:允许的最大 XMX 为 1 GB。

编辑2:JDK版本“1.8.0_91”

4

2 回答 2

0

尝试使用像这样的选项 -Xmx4096m 增加 JVM 的最大堆大小

于 2020-07-06T18:54:00.393 回答
0

请指定您用于此代码的 java 版本。

下面列出了 10 多种不同类型的 OutOfMemoryError,您的可能是“<strong>10.java.lang.OutOfMemoryError: Direct buffer memory”类型。请验证您的异常堆栈跟踪以找到此匹配字符串以确认相同。如果你看到不同的类型,请分享它。

我验证了您在异常跟踪中共享的“java.lang.StringCoding$StringEncoder”类使用了 java.nio.ByteBuffer 和其他相关类。您可以验证以下 url 中的导入部分。 http://cr.openjdk.java.net/~sherman/7040220/webrev/src/share/classes/java/lang/StringCoding.java.html

Java 应用程序可以访问本机内存(不是堆内存)进行缓冲区操作(直接字节)以执行速度操作。为这些直接字节缓冲区操作,从本机内存中为 JVM 分配了一部分内存。如果它的大小不够,您可以使用 VM 标志 –XX:MaxDirectMemorySize= 来增加它(例如 -XX:MaxDirectMemorySize=10M)。使用 –Xmx 标志增加堆内存并不能解决这种类型的内存不足。请尝试 MaxDirectMemorySize 标志,看看它是否能解决您的问题。

如果您想了解有关此 OutOfMemoryError 的更多详细信息,可以阅读Java 性能优化:如何避免 10 个 OutOfMemoryErrors这本书。

1.java.lang.OutOfMemoryError: Java heap space
2.java.lang.OutOfMemoryError: Unable to create new native thread
3.java.lang.OutOfMemoryError: Permgen space
4.java.lang.OutOfMemoryError: Metaspace
5.java.lang.OutOfMemoryError: GC overhead limit exceeded
6.java.lang.OutOfMemoryError: Requested array size exceeds VM limit
7.java.lang.OutOfMemoryError: request "size" bytes for "reason". Out of swap space?
8.java.lang.OutOfMemoryError: Compressed class space
9.java.lang.OutOfMemoryError: "reason" "stack trace" (Native method)
10.java.lang.OutOfMemoryError: Direct buffer memory
于 2020-07-10T09:17:16.217 回答