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