java.lang.OutOfMemoryError: Java heap space at com.sun.crypto.provider.CipherCore.update
java.lang.OutOfMemoryError: Java heap space at com.sun.crypto.provider.CipherCore.update
我正在开发一个 web 应用程序,我需要将一个大约 500mb 的大文件加密为一个图像。第一次代码工作正常,但之后我的服务器给出错误 java.lang.OutOfMemoryError: Java heap space。我正在使用 netbeans 和 glassfish 服务器。我还增加了堆大小。
byte j[] = key.getBytes();
SecretKeySpec kye = new SecretKeySpec(j, "AES");
Cipher enc = Cipher.getInstance("AES");
enc.init(Cipher.ENCRYPT_MODE, kye);
FileOutputStream output = new FileOutputStream("xyz.mkv");
CipherOutputStream cos = new CipherOutputStream(output, enc);
byte[] buf = new byte[104857600];
int read;
while ((read = file.read(buf)) != -1) {
cos.write(buf, 0, read);
}
output.flush();
buf = null;
file.close();
cos.close();
不知道怎么回事wrong.Please求助。
这是堆栈跟踪..
Warning: StandardWrapperValve[DocEncrypt]: Servlet.service() for
servlet DocEncrypt threw exception
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at com.sun.crypto.provider.CipherCore.update(CipherCore.java:666)
at com.sun.crypto.provider.AESCipher.engineUpdate(AESCipher.java:371)
at javax.crypto.Cipher.update(Cipher.java:1832)
at javax.crypto.CipherOutputStream.write(CipherOutputStream.java:158)
简答,启动应用程序时,您需要增加 Java 虚拟机 fe: -Xmx2048m
的最大内存分配池。
有关详细信息,请查看 this amswer。
根据堆栈跟踪和源代码,加密堆栈似乎正在内部分配一个缓冲区,其大小与您使用 write
调用写入的块相同。
您选择了使用非常大的缓冲区;即 104,857,600 字节。所以加密栈本身需要分配一个非常大的缓冲区。
解决方案:
- 您可以增加堆大小。
- 推荐:您可以将缓冲区大小减小到更合理的值。我会推荐 1MiB 或更少。 (比那个大,你通过使缓冲区变大而获得的性能优势很小......)
我正在开发一个 web 应用程序,我需要将一个大约 500mb 的大文件加密为一个图像。第一次代码工作正常,但之后我的服务器给出错误 java.lang.OutOfMemoryError: Java heap space。我正在使用 netbeans 和 glassfish 服务器。我还增加了堆大小。
byte j[] = key.getBytes();
SecretKeySpec kye = new SecretKeySpec(j, "AES");
Cipher enc = Cipher.getInstance("AES");
enc.init(Cipher.ENCRYPT_MODE, kye);
FileOutputStream output = new FileOutputStream("xyz.mkv");
CipherOutputStream cos = new CipherOutputStream(output, enc);
byte[] buf = new byte[104857600];
int read;
while ((read = file.read(buf)) != -1) {
cos.write(buf, 0, read);
}
output.flush();
buf = null;
file.close();
cos.close();
不知道怎么回事wrong.Please求助。 这是堆栈跟踪..
Warning: StandardWrapperValve[DocEncrypt]: Servlet.service() for
servlet DocEncrypt threw exception
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at com.sun.crypto.provider.CipherCore.update(CipherCore.java:666)
at com.sun.crypto.provider.AESCipher.engineUpdate(AESCipher.java:371)
at javax.crypto.Cipher.update(Cipher.java:1832)
at javax.crypto.CipherOutputStream.write(CipherOutputStream.java:158)
简答,启动应用程序时,您需要增加 Java 虚拟机 fe: -Xmx2048m
的最大内存分配池。
有关详细信息,请查看 this amswer。
根据堆栈跟踪和源代码,加密堆栈似乎正在内部分配一个缓冲区,其大小与您使用 write
调用写入的块相同。
您选择了使用非常大的缓冲区;即 104,857,600 字节。所以加密栈本身需要分配一个非常大的缓冲区。
解决方案:
- 您可以增加堆大小。
- 推荐:您可以将缓冲区大小减小到更合理的值。我会推荐 1MiB 或更少。 (比那个大,你通过使缓冲区变大而获得的性能优势很小......)