Tomcat 8.0.51启动莫名延迟20秒问题排查求助
Tomcat 8.0.51启动卡顿20秒的解决方案
我之前帮好几个开发者排查过Tomcat 8.0.x升级后的启动阻塞问题,结合你提供的日志片段和版本跨度(从8.0.32到8.0.51),90%的概率是SecureRandom随机数生成阻塞导致的——这是Tomcat 8.0.30+版本引入的典型问题。
问题根源
Tomcat 8.0.30之后调整了默认的随机数生成策略,依赖系统的/dev/random设备获取随机数。但这个设备在服务器环境(尤其是无桌面的云服务器)中,经常会因为系统熵池不足(缺少鼠标、键盘输入这类随机事件)而阻塞,等待熵池填充,这就导致了启动时那20秒的停顿。
快速解决方法
这里有两种靠谱的解决方案,按优先级推荐:
1. 临时调整Tomcat启动参数(快速生效)
找到Tomcat安装目录下的bin/catalina.sh(Linux/macOS)或bin/catalina.bat(Windows),找到JAVA_OPTS配置项,添加以下参数:
-Djava.security.egd=file:/dev/./urandom
注意一定要写/dev/./urandom而不是直接/dev/urandom——部分JDK版本对后者的解析存在问题,加个./可以绕过这个限制。
2. 永久修改JDK安全配置(一劳永逸)
找到你的JDK安装目录,进入jre/lib/security文件夹,打开java.security文件,找到这一行:
securerandom.source=file:/dev/random
将其修改为:
securerandom.source=file:/dev/./urandom
保存后重启Tomcat,所有使用该JDK的应用都会默认使用非阻塞的随机数源。
验证修复效果
修改完成后重启Tomcat,观察日志中的时间戳:如果Catalina.load到StandardEngine.startInternal之间的时间差从20秒缩短到几百毫秒,就说明问题已经解决了。
内容的提问来源于stack exchange,提问作者Etep
相关产品推荐
相关产品推荐

