jBcrypt:BCrypt.checkpw突然需要大约30倍的时间

Mat*_* M. 6 bcrypt jbcrypt

在我们的Web应用程序中,我们使用jBcrypt进行散列密码.在对密码进行散列时,我们使用13个log_rounds.

通常,BCrypt.checkpw()大约需要1秒钟.但是不时(几天之后),它突然开始变慢,从那个时间开始需要将近30秒并且没有恢复到正常速度.重新启动Tomcat是唯一有用的东西.

我不会怀疑这是否会不时发生,例如,如果CPU负载很高或GC正在运行.但情况并非如此,它只是突然开始变慢.只有登录过程受到影响,应用程序的其余部分仍然很快.我们也没有任何可确定的内存泄漏或其他性能问题.只是BCrypt.checkpw()很慢.线程转储显示BCrypt.checkpw和后续方法调用消耗的时间,尤其是BCrypt.encipher:

Thread 8597: (state = IN_JAVA)
 - org.mindrot.jbcrypt.BCrypt.encipher(int[], int) @bci=0, line=490 (Interpreted frame)
 - org.mindrot.jbcrypt.BCrypt.key(byte[]) @bci=122, line=562 (Interpreted frame)
 - org.mindrot.jbcrypt.BCrypt.crypt_raw(byte[], byte[], int) @bci=89, line=629 (Compiled frame)
 - org.mindrot.jbcrypt.BCrypt.hashpw(java.lang.String, java.lang.String) @bci=226, line=692 (Interpreted frame)
 - org.mindrot.jbcrypt.BCrypt.checkpw(java.lang.String, java.lang.String) @bci=3, line=763 (Interpreted frame)
Run Code Online (Sandbox Code Playgroud)

我在SO上只发现了一个类似的问题,但在我们的例子中,多个类加载器不是问题: 使用jbcrypt时可变性能和降级性能

有谁知道这里发生了什么?