记录一次Tomcat启动缓慢的解决方案

之前写完一个项目,像平常一样mvn clean install 打成war包,接着放入Tomcat的webapps目录下,最后启动bin目录的startup.sh,最多10几秒后,访问首页,一切正常。

最近有几次,同样的war包,启动Tomcat居然花费这么长的时间。

这么久,我等的花都谢了。一度以为自己的war包有问题,重新打包,放入Tomcat中,依然启动缓慢。接着以为Tomcat的版本有问题,又换了一个高版本的试了下,依然出现同样的问题。

还好,我仔细查看了logs底下的catalina.out文件,看到有一个过程耗时严重。

这段话的意思是,Tomcat使用SessionIdGeneratorBase.createSecureRandom创建一个安全的随机数实例作为会话id,产生随机数的算法为SHA1PRNG

问题就出在这个随机数生成算法中,查阅资料,发现该算法有两种文件形式的初始化方式:

  • /dev/random  
  • /dev/urandom 

它们产生随机数的原理是利用当前系统的熵池来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回

熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等。

他们的区别在于:

/dev/random,是一种高质量的随机数生成器,具有非常高的保护性与安全性,因此需要熵池收集到足够的噪声数据。当熵池为空或者熵池没收集到足够多的的数据时,将会阻塞随机数的生成,也终将阻塞Tomcat的启动,从而造成Tomcat启动耗时严重。/dev/random非 常适合那些需要非常高质量随机性的场景,比如一次性的支付或生成密钥的场景。

而/dev/urandom,不会阻塞,当然生成随机数的效果也不好。在仅仅将随机数作为会话id时,我们没有必要使用安全性与随机性特别高的/dev/random,使用/dev/urandom便可以满足,这将大大缩短Tomcat的启动时间,从几分钟缩短至几秒钟。

解决方案有以下两种:

  • 在Tomcat环境中解决

在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/urandom 即可。如图:

  • 在jdk安装目录配置

编辑$JAVA_HOME/jre/lib/security/Java.security文件,将securerandom.source=file:/dev/random 中的random换成urandom即可。

不过,一般不推荐第二种方法。第二种方式虽然可以一劳永逸,但是却限制所有的项目默认使用随机性与安全新较低的urandom。按照哲学观点来看,具体问题具体分析,且解决方案应该具有针对性,我们只需修改Tomcat的catalina.sh脚本即可。

 

按照第一种方式修改后,Tomcat的启动时间大幅度缩短了,今天又可以早点下班了。

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Quartz是一个开源的调度框架,常用于定时任务的调度和执行。当我们将Quartz集成到Tomcat中,并希望在Tomcat启动时执行一次任务时,可以按照以下步骤进行配置。 首先,我们需要在Tomcat的web.xml文件中配置一个Servlet,用于接收Tomcat启动的事件通知。在该Servlet的初始化方法中,我们可以通过调用Quartz的Scheduler实例的start方法来启动Quartz的调度器,以便开始任务的调度。 然后,我们需要定义一个Quartz的Job类,该类实现了Quartz的Job接口。在Job类中,我们可以实现我们需要执行的任务逻辑。例如,如果我们希望在Tomcat启动时打印一条日志,则可以在Job类的execute方法中执行打印日志的逻辑。 接下来,我们需要在Quartz的配置文件(例如quartz.properties)中配置需要执行的Job。在配置文件中,我们可以指定调度任务的执行时间和频率。例如,我们可以使用Cron表达式来定义定时任务的执行时间,如每天的凌晨2点执行一次。 最后,我们将配置文件和Job类放置在项目的classpath目录下,并将其添加到Tomcat的类路径中。 当我们启动Tomcat时,Tomcat会初始化Servlet,并触发Servlet的初始化方法。在初始化方法中,我们会调用Quartz的Scheduler实例的start方法,从而启动Quartz的调度器。Quartz的调度器会按照配置文件中的设定,执行我们定义的任务逻辑,例如打印一条日志。 总结起来,通过在Tomcat中集成Quartz,并在Tomcat启动时执行一次任务,我们可以使用Tomcat启动事件通知机制,在Quartz中定义和调度任务,并在任务启动时执行我们所需的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunAlwaysOnline

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值