本文描述Tomcat启动因为 Creation of SecureRandom instance for session ID generation using [SHA1PRNG] 卡住的问题,以及At least one JAR was scanned for TLDs yet contained no TLDs 解决办法
最初是升级dubbo项目开始,项目启动变慢一两分钟,后边突然就很过分十分钟,甚至还要多。
导致发版的时候要等很久,很有压力。
找到奇怪的日志
Creation of SecureRandom instance for session ID generation using [SHA1PRNG]
通过这个日志,顺便科普到好些知识。简单讲是Tomcat启动需要通过 /dev/random 这个文件获取系统生成的安全随机数。随机数通过熵池获取(熵指当前系统的环境噪音,即一个系统的混乱程度,)。
通过random获取的是高安全性的随机数,因受系统环境影响其产生随机数的速度,所以产生速度慢。
通过/dev/urandom,产生的相对random低安全性的随机数,不受系统环境影响,产生速度非常快。
可以用命令 cat /dev/urandom | od -x ,(od -x是二进制转成十进制),一下就看到好几页随机数,在测试环境看random会慢一些,有时就几个字节卡死不动了。
解决办法:
方式一,在JVM中解决
修改 jre/lib/security 下的文件,java.security,找到
|
将其替换为:
|
为什么是 ./urandom,这是java的一个bug,简单说是不加点会使程序继续读random文件。
官方的bug记录地址
因为没有权限更改所以有第二种解决方式。
方式二,在tomcat中解决
tomcat/bin,找到文件 catalina.sh,添加内容
if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; then
JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
fi
我加在了这个位置:
解决。
之前
现在
丝滑~
但是在windows环境这两种方式都没能解决我的问题,不过只有5004ms,还能接受。