Tomcat严重依赖SecureRandom这个类为它的session id或其它地方取得随机数值,这取决于你的JRE。
它有可能在tomcat启动时造成非常大的耗时,比如,在启动tomcat的时候,它耗时有时候会达到3分钟。
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [XXXXXXX] milliseconds
要解决这个问题,可以通过配置JRE使用非阻塞的Entropy Source,在bin/catalina.sh中加入这么一行:-Djava.scurity.egd=file:/dev/./urandom。
或者通过修改jre来解决这个阻塞的问题:
打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容:
securerandom.source=file:/dev/random
替换成
securerandom.source=file:/dev/urandom
问题的核心是指向随机密码生成器中,关于环境噪音采集部分的处理。所谓环境噪音,就是来自各个设备驱动与其它来源的二进制数据,也称之为熵。熵池则是存储这些噪音数据的地方。当熵池为空的时候,采用/dev/random会存在阻塞。但是,检查环境配置,安装的java是采用/dev/urandom进行处理。其模式是熵池为空时,非阻塞。很显然,还不止如此,从stackoverflow链接中可以找到一段描述,解释了为何jdk用了/dev/urandom,但是还是不生效。
随机数生成器,基于SHA1PRNG。而SHA1PRNG重度依赖高质量的种子,如果种子不够好,随机数结果将可被预测。因此开发人员需要确保/dev/random被用作熵的来源,即便JVM配置为使用/dev/urandom。所以切换熵源为/dev/urandom,也需要确保/dev/random有足够的熵。
关于这个问题在java.com里有这么类似的小插曲:
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6202721
stackoverflow关于该问题的一些解答:
http://stackoverflow.com/questions/26431922/tomcat7-starts-too-late-on-ubuntu-14-04-x64-digitalocean/26432537#26432537
关于tomcat启动快的策略在apache的官方也有相应的文档有描述
http://wiki.apache.org/tomcat/HowTo/FasterStartUp