优化tomcat启动时间

时间:2014-09-16 11:13:27

标签: java tomcat startup

我的应用程序非常庞大,包含例如web-inf / lib中的310个jar,总共100Mb。启动服务器,此步骤需要13秒:

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

应用程序依赖于Web片段和注释来正确启动。

我尝试了以下操作来跳过13s的扫描时间:

  • 修改conf/context.xml with attribute logEffectiveWebXml="true"

  • catalina run 2> web-complete.log

  • web.xml中提取web-complete.log代码段,并将其保存在webapps\ROOT\web-inf\web.xml

如果我开始申请,我仍然会看到13秒的扫描时间。在上面的snipet中,metadata-complete已经设置为“true”。

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

<absolute-ordering />

1)在我的情况下,让tomcat快速启动的正确方法是什么?

2)你能解释为什么元数据完整对13s没有帮助吗?

3)尽管我的web.xml已经完成,为什么不允许应用启动?

谢谢,

2 个答案:

答案 0 :(得分:8)

您可能认为默认情况下,Tomcat在部署您的Web应用程序时执行的操作效率低下,如果您做出正确的更改,您可以克服它并使您的Web应用程序更快地启动。这些都不是安全的假设。 Tomcat往往非常高效,甚至可以处理大型Web应用程序。

听起来像你的webapp足够大,JDK无法加载大量的类,并在13秒内实现大量的对象。时间可能主要用于实例化和初始化servlet及其所需的所有内容,如果您的webapp在提供请求之前有许多大型子系统要初始化,那么这是一项非常大的工作。完成所有这些操作肯定需要几十秒,在此期间,解析配置文件的时间不多,甚至打开JAR来查找和解析一些文件。

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

潜在的启动优化

您可能专门为大型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时应该跳过的所有JAR,我的猜测是Tomcat启动webapp的部分将更快完成。提前多久取决于webapp。

答案 1 :(得分:1)

回答我自己的问题:

2)你能解释为什么将metadata-complete设置为true无助于减少13s吗?

元数据完整属性不直接控制类注释扫描。它控制是否会发现网络片段,然后反过来扫描这些片段中包含的类。

如果在&lt; absolute-ordering&gt;中启用了相同的网络片段(或留空),ServletContainerInitializer.onStartup(Set&gt;,ServletContext)将独立于metadata-complete的值接收同一组带注释的类。

因此,改变元数据完整性的价值本身不会对爆炸战争部署/类扫描产生影响。只有在指定了webfragments时才会发生更改。

作为副作用,不会扫描不属于网络片段的jars,这可能会导致TLD中带注释的类的问题。因此,重要的是应用程序的所有组件都是Web片段,以便从此优化中受益。

3)尽管我的web.xml已经完成,为什么它不允许应用启动?

使用选项logEffectiveWebXml =&#34; true&#34;在conf / context.xml上设置,只记录侦听器和过滤器。未指定ServletContainerInitializers(SCI)。

如果&lt; absolute-ordering&gt;未在web.xml中设置,SCI将作为Web片段扫描的一部分被发现。如果它在上面的示例中设置为空,则将跳过所有Web片段,因此应用程序将无法启动。