首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化tomcat启动时间

优化tomcat启动时间
EN

Stack Overflow用户
提问于 2014-09-16 11:13:26
回答 2查看 14.5K关注 0票数 11

我的应用程序相当大,例如,在web/lib中包含310 jars,总共包含100 My。启动服务器,下面这一步需要13s:

代码语言:javascript
复制
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

如果我启动我的应用程序,我仍然看到13s扫描时间。在上面的片段中,元数据完成已经被设置为"true“。

在将以下语句添加到web.xml之后,完全跳过了13,但这一次我的应用程序不能再启动了:

代码语言:javascript
复制
<absolute-ordering />

( 1)在我的情况下,怎样才能使猫快速地开始呢?

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

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

谢谢,

EN

回答 2

Stack Overflow用户

发布于 2014-09-16 20:50:58

您可能会假设Tomcat在部署when应用程序时会做一些效率低下的事情,如果您做了正确的更改,您就可以绕过它,使您的webapp启动得更快。这些都不是安全的假设。Tomcat非常高效,甚至可以处理大型网络应用程序。

在我看来,在JDK无法在13秒内加载大量类并实例化大量对象的情况下,您的less应用程序就足够大了。这些时间可能主要用于实例化和初始化servlet及其所需的一切,如果您的has应用程序在服务请求之前有许多大型子系统需要初始化,这将是一项非常大的工作。完成所有这些工作肯定需要几十秒的时间,在此期间,解析配置文件的时间不多,甚至打开JAR来查找和解析配置文件。

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

一种潜在的启动优化

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

代码语言:javascript
复制
# 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启动webapp的部分会更快完成。多少时间取决于网络应用程序。

票数 9
EN

Stack Overflow用户

发布于 2014-09-17 16:15:15

回答我自己的问题:

2)您能解释为什么将元数据完全设置为true无助于减少13s ?吗?

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

如果在(或空)中启用相同的web片段,则ServletContainerInitializer.onStartup(Set>、ServletContext)将收到与元数据完整值无关的同一组带注释的类。

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

作为一种副作用,不属于web碎片的jars将不会被扫描,这可能会导致TLD中带注释的类出现问题。因此,重要的是,应用程序的所有组件都是web片段,以便从这种优化中获益。

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

通过在conf/context.xml上设置选项logEffectiveWebXml="true“,只记录侦听器和过滤器。未指定ServletContainerInitializers (SCI)。

如果不在web.xml中设置,SCI将作为web片段扫描的一部分被发现。如果设置为空,如上例所示,所有web片段都将被跳过,因此应用程序将不会启动。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25867282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档