java - 优化tomcat启动时间

标签 java tomcat startup

我的应用程序非常大,例如在 web-inf/lib 中包含 310 个 jar,总共 100Mb。启动服务器,下面这一步需要13s:

Sep 16, 2014 1:05:33 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\apache-tomcat-7.0.47\webapps\ROOT

应用程序依赖于网络片段和注释才能正常启动。

我尝试了以下方法来跳过 13 秒的扫描时间:

  • 使用属性 logEffectiveWebXml="true"修改 conf/context.xml

  • catalina run 2> web-complete.log

  • web-complete.log中提取web.xml片段,保存在webapps\ROOT\web-inf\web.xml下

如果我启动我的应用程序,我仍然看到 13 秒的扫描时间。 metadata-complete 在上面的代码片段中已经设置为“true”。

将以下语句添加到 web.xml 后,完全跳过了 13s,但这次我的应用程序无法启动:

<absolute-ordering />

1) 在我的案例中,使 tomcat 快速启动的正确方法是什么?

2) 你能解释一下为什么 metadata-complete 对 13 岁没有帮助吗?

3) 虽然我的 web.xml 已经完成,但为什么不允许应用程序启动?

谢谢,

最佳答案

您可能假设 Tomcat 在默认情况下在部署您的 web 应用程序时做一些低效的事情,并且如果您做出正确的更改,您可以绕过它并使您的 web 应用程序启动得更快。这些都不是安全的假设。 Tomcat 往往非常高效,甚至可以处理大型 Web 应用程序。

在我看来,您的 Web 应用程序足够大,JDK 无法在不到 13 秒的时间内加载大量类并实例化大量对象。时间可能主要花在实例化和初始化 servlet 及其所需的一切上,如果您的 webapp 在服务请求之前有许多大型子系统要初始化,那么这是一项非常大量的工作。完成所有这些肯定会花费数十秒,并且在此期间没有太多时间花在解析配置文件上,甚至打开 JAR 文件来查找和解析一些配置文件也是如此。

为什么您的 webapp 无法以静态元数据完整部署描述符开始,我不知道,部分原因是您没有说明失败时失败的具体方式。但是,通过将 metadata-complete 设置为 true,您可能绕过了 Web 应用程序所依赖的 Web 应用程序启动的必要部分。

潜在的启动优化

您可以为您的大型 web 应用程序专门配置的东西可以节省 Tomcat 大量查看您的 web 应用程序文件的时间:跳过您知道 Tomcat 不应扫描某些内容的 JAR,例如 Servlet 3 片段和 TLD。查看您的 Tomcat 的 conf/catalina.properties 文件。这些可配置的系统属性都在其中:

# Additional JARs (over and above the default JARs listed above) to skip when
# scanning for Servlet 3.0 pluggability features. These features include web
# fragments, annotations, SCIs and classes that match @HandlesTypes. The list
# must be a comma separated list of JAR file names.
org.apache.catalina.startup.ContextConfig.jarsToSkip=

# Additional JARs (over and above the default JARs listed above) to skip when
# scanning for TLDs. The list must be a comma separated list of JAR file names.
org.apache.catalina.startup.TldConfig.jarsToSkip=tomcat7-websocket.jar

添加所有在 Tomcat 搜索时应跳过的 JAR,我猜 Tomcat 启动 Web 应用程序的部分会更快完成。多快取决于网络应用程序。

关于java - 优化tomcat启动时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25867282/

相关文章:

java - 处理可能出现时间关键错误的异步保存?

java - 如何为 ReSTLet 设置根 url

java - 当我引用 ArrayList.add 方法时,Android 应用程序在启动时崩溃

angularjs - 加载 Angular 模块时如何异步加载数据?

spring - 有没有一种诊断 spring bean/服务创建问题的好方法?

java - 如何配置使用 Kalium 的 Java 库在 Mac OSX 和 Android 上运行?

java - 为什么要避免 Java 中的常量折叠?什么时候?

Java - 只读取文件的第一行

java - 打开具有不同结果的相同 Activity 。来自 MainActivity

java - Spring(mvc,websockets)在创建实例时有时会引发异常