99网
您的当前位置:首页如何优化并提供 Tomcat的启动速度

如何优化并提供 Tomcat的启动速度

来源:99网

  有时候我们可能会遇到 Tomcat 启动特别慢的情况,特别是遇到新项目上线的情况下可能需要重启服务,这时候我们希望 Tomcat 能够快速启动提供服务。

  实际上,这个话题,下面针对 Tomcat 8.5 和 9.0 的版本,给出几条明确的建议,可以现学现用。

清理你的 Tomcat

1. 清理不必要的 Web 项目

  首先我们要删除 webapps 文件夹下的不需要的工厂,一般是 host-manager、example、doc 等这些默认的工程,可能还有之前添加的但是现在用不到的项目,这些最好全部删掉。如果你观察日志会发现每次 Tomcat 启动的时候都会重新部署这些工程。

2. 清理 XML 配置文件

  Tomcat 在启动时会解析配置文件创建初始化启动对应组件,而 XMl 文件解析的代价可不小,因此我们要尽量保证配置文件的简介,需要解析的东西越少,速度自然就会快。

3. 清理 JAR 文件

4. 清理其他文件

禁止 Tomcat TLD 扫描

  Tomcat 为了支持 JSP,在应用启动的时候会扫描 JAR 包里面的 TLD 文件,夹在里面定义的标签库,所以在 Tomcat 的启动日志里,你可能会碰到这样的提示:

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.
指的是 Tomcat 扫描了 Web 应用下的 JAR 包,没有发现 TLD 文件。

  最好去配置一下 Tomcat 不要去扫描这些 JAR 包,这样可以提高 Tomcat 的启动时间,并节省 JSP 的编译时间。那么如何配置不去扫描这些 JSP 包呢?这里分为两种情况:

  • 第一种是项目没有 JSP 作为 Web 页面模板,是应用 Velocity、或者前后端分类的模式,你就可以把 TLD 扫描禁止掉。方法是,找到 Tomcat 的 conf/ 目录下的 content.xml 文件,加上 JarScanner 和 JarScanFilter 子标签,像下面这样:

  • 如果项目使用了 JSP 作为 Web 页面模板,表示 TLD 扫描无可避免,但是我们可以通过配置来告诉 Tomcat,只扫描那些包含 TLD 文件的 JAR 包。**方法是,找到 Tomcat 的 conf/ 目录下的 catalina.properties 文件,**在这个文件里的 jarsToSkip 配置中加上你的 JAR 包:
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=xxx.jar

关闭 WebSocket 支持

关闭 JSP 功能支持

  如果你不需要 JSP 功能,可以像下面这样(就跟关闭 WebSocket 一样):

禁止 Servlet 注解扫描

  如果你也不需要 Servlet 注解这个功能,可以告诉 Tomcat 不去扫描。具体的实现方式是去 Web 应用的 web.xml 文件中,设置元素的属性metadata-complete=“true”,像下面这样:

配置Web-Fragment 扫描

  你可以通过配置web.xml里面的元素直接指定了哪些 JAR 包需要扫描web fragment,如果元素是空的, 则表示不需要扫描,像下面这样:

随机数熵源优化

  是比较一个出名的问题,Tomcat 7 以上的版本依赖 Java 的SecureRandom 类来生成随机数,比如 Session ID。而 JVM 默认使用阻塞式熵源(/dev/random), 在某些情况下就会导致 Tomcat 启动变慢。当阻塞时间较长时, 你会看到这样一条警告日志:

org.apache.catalina.util.SessionIdGenerator createSecureRandomINFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [8152] milliseconds.

  具体的。这里我们谈论的是解决方案:通过设置,让 JVM 使用非阻塞式的熵源。

  设置 JVM 参数

 -Djava.security.egd=file:/dev/./urandom

网友总结

  一般来说,以上的方案部分是很少用到的。顺便再让我们来看看网友们的几种解决方案:

因篇幅问题不能全部显示,请点此查看更多更全内容