导致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.

Tomcat 启动时 SecureRandom花费很多的时间-yellowcng_生成器

可以看到,这个玩意居然花费了193,816ms ,那就是3分钟啊, 很不科学啊

SecureRandom generateSeed 使用 /dev/random 生成种子。但是 /dev/random 是一个阻塞数字生成器,如果它没有足够的随机数据提供,它就一直等,这迫使 JVM 等待。键盘和鼠标输入以及磁盘活动可以产生所需的随机性或熵。但在一个服务器缺乏这样的活动,可能会出现问题。

版本信息

Tomcat 启动时 SecureRandom花费很多的时间-yellowcng_java_02

解决办法

  1. 在Tomcat环境中解决:
    可以通过配置 JRE 使用非阻塞的 Entropy Source:
    在 catalina.sh 中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。
  2. 在 JVM 环境中解决:
    打开 $JAVA_PATH/jre/lib/security/java.security 这个文件,找到下面的内容:
securerandom.source=file:/dev/random

替换成:

securerandom.source=file:/dev/./urandom

Tomcat 启动时 SecureRandom花费很多的时间-yellowcng_tomcat_03

参考文章

https://www.jb51.net/article/117086.htm