解决tomcat启动项目很慢的问题 Skipping unneeded JARs during scanning can improve startup time and JSP compila...
Tomcat在启动是提示:
INFO [localhost-startStop-1] org.apache.jasper.servlet.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.
引言:
今天在linux使用tomcat+war包方式部署项目的时候,发现tomcat启动时,会卡住一段时间,接近4分钟左右。这对拥有小暴脾气的我肯定没法接受,网上也有很多的解决方案,一一尝试没一个有用,经过各种FQ查阅资料,终于找到解决方案,特此记录下
现象:
- 观察启动日志可看到如下警告日志:
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
每天学习一点点,你就进步一点点。