当通过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因其他原因而被破坏。
答案 0 :(得分:0)
BouncyCastle没有出现此问题。 BouncyCastle与JCE SSL实现完全兼容。
您可以通过以下代码
来选择BouncyCastle而不是JCESecurity.insertProviderAt(new BouncyCastleProvider(), 1);
这解决了我们的GC问题。