Java SSL 内存分配过多

标签 java ssl encryption

当通过 swebhdfs 下载大文件时,java 分配了过多的字节数组并立即将其作为垃圾处理。尽管这些都是短暂的字节数组,但它们会触发过多的小暂停,从而导致应用程序出现不可预测性。

enter image description here

据我了解,问题是 CipherBox.decrypt 将相同的字节数组重新用于输入和输出调用 Cipher.update http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/security/ssl/CipherBox.java#469

如果为输入和输出传递相同的数组,大多数 Cipher 实现会分配一个新的字节数组并返回它。如果您不使用 SSL 下载大数据,这无关紧要。在我们的案例中,我们从 Hadoop 下载数 TB 的数据,这会导致大量次要的 GC 暂停。

以前有人遇到过这个问题吗?我相信只有 RSA 没有这种行为的密码,但 RSA 因其他原因而被破坏。

最佳答案

BouncyCaSTLe 不会出现此问题。 BouncyCaSTLe 与 JCE SSL 实现完全兼容。

您可以通过以下代码更喜欢 BouncyCaSTLe 而不是 JCE

Security.insertProviderAt(new BouncyCastleProvider(), 1);

这为我们解决了 GC 问题。

关于Java SSL 内存分配过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33770439/

相关文章:

java - JaxB 读取类层次结构

java - Heroku:带有 https tomcat 服务器和证书固定的 Spring Boot Gradle 应用程序

c++ - 8192位异或加密?

apache - 无法验证身份服务器 SSL 握手错误

ios - 适用于 iOS 的 SqlCipher 是否符合 FIPS

encryption - 使用 AES 进行文件完整性检查,替换 MD5

java - 使用 junit 测试 Java 中的无修饰符方法

java - 我似乎收到错误 Duplicate class in a java class

java - 当函数的代码作为方法参数传递时,如何测试它?

spring - Jenkins 正在用它的系统属性更新我的 applicationContext.xml 文件?