解决tomcat启动项目很慢的问题 Skipping unneeded JARs during scanning can improve startup time and JSP compila...

小明的个人博客

引言:

今天在linux使用tomcat+war包方式部署项目的时候,发现tomcat启动时,会卡住一段时间,接近4分钟左右。这对拥有小暴脾气的我肯定没法接受,网上也有很多的解决方案,一一尝试没一个有用,经过各种翻墙查阅资料,终于找到解决方案,特此记录下

现象:

  • 观察启动日志可看到如下警告日志:
TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time
  • 这段日志的原因是:
    1:Tomcat启动时会扫描大量jar包,如果含有不符合TLD规范的就会出现这个问题
    2:以后基本上不会使用JSP作为视图层,所以我们可能根本不需要TLD这个东西,就算不要TLD也没有什么关系

解决办法:

1:查找tomcat/conf/catalina.properties 修改tomcat.util.scan.StandardJarScanFilter.jarsToSkip=的值为*.jar
这段配置代表tomcat在启动时,跳过所有的jar扫描。但是本人亲测并没有作用
2:修改jre随机种子的生成规则。

  • 原因:Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom类产生安全随机类SecureRandom的实例作为会话ID,我这儿花了300多S
  • 产生器会评估熵池(entropy pool)中的噪声数量。随机数是从熵池中进行创建的。当读操作时,/dev/random设备会只返回熵池中噪声的随机字节。/dev/random非常适合那些需要非常高质量随机性的场景,比如一次性的支付或生成密钥的场景。
    当熵池为空时,来自/dev/random的读操作将被阻塞,直到熵池收集到足够的环境噪声数据。这么做的目的是成为一个密码安全的伪随机数发生器,熵池要有尽可能大的输出。对于生成高质量的加密密钥或者是需要长期保护的场景,一定要这么做。

最终解决办法

  • 在Tomcat环境中解决 可以通过配置JRE使用非阻塞的Entropy Source。
 在$TOMCAT_HOME/conf/catalina.sh中加入:-Djava.security.egd=file:/dev/./urandom 即可。
  • 在JVM环境中解决
打开$JAVA_HOME/jre/lib/security/java.security这个文件,将securerandom.source的值修改为file:/dev/./urandom

END:

使用这种方案后,启动速度从300多S下降至10S

小明的个人博客

你可能感兴趣的:(解决tomcat启动项目很慢的问题 Skipping unneeded JARs during scanning can improve startup time and JSP compila...)