导致tomcat启动非常的慢的原因,是由于Tomcat 7/8 都使用 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 类产生安全随机类 SecureRandom 的实例作为会话 ID。然而通过
securerandom.source=file:/dev/random
的这种生成器,是阻塞的,所以服务阻塞,导tomcat卡死了。
异常问题
org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [193,816] milliseconds.
可以看到,这个玩意居然花费了193,816ms ,那就是3分钟啊, 很不科学啊
SecureRandom generateSeed 使用 /dev/random 生成种子。但是 /dev/random 是一个阻塞数字生成器,如果它没有足够的随机数据提供,它就一直等,这迫使 JVM 等待。键盘和鼠标输入以及磁盘活动可以产生所需的随机性或熵。但在一个服务器缺乏这样的活动,可能会出现问题。
版本信息
解决办法
- 在Tomcat环境中解决:
可以通过配置 JRE 使用非阻塞的 Entropy Source:
在 catalina.sh 中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。 - 在 JVM 环境中解决:
打开$JAVA_PATH/jre/lib/security/java.security
这个文件,找到下面的内容:
securerandom.source=file:/dev/random
替换成:
securerandom.source=file:/dev/./urandom
参考文章
https://www.jb51.net/article/117086.htm