docker+tomcat 启动时非常慢,一般正常启动几十秒的,发现docker+tomcat启动竟需要几分钟,不可思议

根本原因是 SecureRandom 这个 jre 的工具类的问题。那为什么 SecureRandom generateSeed 这么慢,甚至挂在
Linux 操作系统呢?

Tomcat 7/8 都使用
org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 类产生安全随机类
SecureRandom 的实例作为会话 ID。

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

 

有2种解决方案:

1. 在Tomcat环境中解决:

可以通过配置 JRE 使用非阻塞的 Entropy Source:
在 catalina.sh 中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。
 

2. 在 JVM 环境中解决(本人使用此方法):

打开jdk安装路径 $JAVA_PATH/jre/lib/security/java.security 这个文件,找到下面的内容:
securerandom.source=file:/dev/random
替换成:
securerandom.source=file:/dev/./urandom
 

问题完美解决

这里值为何要在 dev 和 random 之间加一个点呢?是因为一个 JDK 的 bug,有人反馈即使对 securerandom.source 设置为
/dev/urandom 它也仍然使用的 /dev/random,有人提供了变通的解决方法,其中一个变通的做法是对 securerandom.source
设置为 /dev/./urandom 才行。也有人评论说这个不是 bug,是有意为之。

友情链接
ioDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信