tomcat的启动慢, 罪魁祸首是 SecureRandom类。tomcat7以上的版本,在启动时会调用SecureRandom类来生成随机数。如果用于初始化SecureRandom的熵源是个短熵(熵不够用), 就会报 warning。
jdk的配置文件中,使用 securerandom.source 设置了熵源:
cat /usr/java/jdk1.8.0_121/jre/lib/security/java.security
securerandom.source=file:/dev/random
可以看到默认值是:/dev/random。
所以程序启动后SecureRandom类会读取/dev/random以获取随机序列,这是一个同步操作。当熵池(entropy pool) 中没有足够的熵时,读取/dev/random就会造成阻塞,直到收集到了足够的熵,程序才会继续往下进行。
解决方法是修改成非阻塞的熵源/dev/urandom。
可以修改java.security文件中的securerandom.source值,也可以使用参数java.security.egd:
java -jar app.jar -Djava.security.egd=file:/dev/./urandom
至于为什么是/dev/./urandom,而不是/dev/urandom,这源于java的一个bug。
大意是/dev/urandom在某些情况下可能还是最终会转换成调用/dev/random。所以为了保险起见,还是使用/dev/./urandom吧!