MangoCool

如何使你的tomcat启动更快

2020-12-08 15:23:55   作者:MangoCool   来源:MangoCool

亲测,效果明显,tomcat8,部署应用2个,从启动需要35s降低到15s。

如果只想解决问题只看红字即可。


一、JAR扫描

Servlet 3.0规范(第8章)引入了对几个“插件性特性”的支持。它们的存在是为了简化 web 应用程序的结构和简化附加框架的插入。

不幸的是,这些特性需要扫描 JAR 和类文件,这可能会花费大量的时间。

与规范的一致性要求默认情况下执行扫描,但是您可以通过几种方式配置您自己的 web 应用程序来避免这种情况(见下文)。还可以配置哪些 JARs Tomcat 应该跳过。

1. 配置您的 web 应用程序

可以在 WEB-INF/web.xml 文件中指定两个选项:

1. 元素<web-app> 中的属性设置metadata-complete="true"

2. 添加一个空元素<absolute-ordering /> 设置 metadata-complete="true"禁止扫描 web 应用程序及其库中使用注释定义 web 应用程序组件(servlets 等)的类。

metadata-complete选项不足以禁用所有的注释扫描。

如果有一个具有@handlestypes注释的SCI,Tomcat必须扫描您的应用程序,以找到使用注释或该注释中指定的接口的类。

<absolute-ordering>元素指定了哪些web片段jar(根据它们的WEB-INF/web-fragment.xml文件中的名称)必须被扫描以获取SCIs、fragment和annotations。空的<absolute-ordering/>元素配置为不扫描。

在Tomcat 7中,绝对排序选项影响web应用程序和容器(即$CATALINA_HOME/lib中的库)提供的SCIs的发现。

在Tomcat 8中,该选项只影响web应用程序,而始终发现容器提供的SCIs,而不管绝对顺序如何。在这种情况下,仅凭绝对排序选项并不阻止对注释的扫描,但是要扫描的JARs列表将是空的,因此扫描将快速完成。无论绝对顺序如何,WEB-INF/classes中的类总是被扫描的。

web应用程序资源扫描和TLD扫描不受这些选项的影响。

具体操作:WEB-INF/web.xml 元素<web-app> 中的属性设置metadata-complete="true",同时再添加一个空元素<absolute-ordering />

2. 删除不必要的 jar 文件

删除所有不需要的 JAR 文件。在搜索类时,需要检查每个 JAR 文件以查找所需的类。如果 jar 文件不存在,那么就没有什么可以搜索的了。

注意,web 应用程序永远不应该有自己的 Servlet API 或 Tomcat 类的副本。所有这些都是由容器(Tomcat)提供的,不应该出现在 web 应用程序中。如果您正在使用 Apache Maven,那么应该用 <scope>provided</scope> 来配置这种依赖关系。 

具体操作:以maven管理jar包为例,依赖添加作用范围<scope>provided</scope>

3. 从扫描中排除 jar

在Tomcat 7中,可以通过在系统属性中列出它们的名称或名称模式来排除扫描JAR文件。这些通常在conf/catalina.properties文件中。

在Tomcat 8中有几个可用的选项。你可以在web应用程序的上下文文件中使用系统属性或配置<JarScanFilter>元素。

具体操作:tocmat/conf/context.xml 添加元素

<Context>
    <JarScanner>
        <JarScanFilter defaultPluggabilityScan="false" />
    </JarScanner>
</Context>

4. 取消websocket支持

在上下文元素上存在一个属性,containerSciFilter。它可以用来禁用通过SCI API插入到Tomcat的容器提供的特性:WebSocket支持(在Tomcat 7和更高版本中)、JSP支持(在Tomcat 8和更高版本中)。

要筛选的类名可以通过查找 Tomcat jar 中的 META-INF/services/javax.servlet.ServletContainerInitializer 文件来检测。

对于WebSocket支持,名称是org.apache.tomcat.websocket.server.WsSci,对于JSP支持,名称是org.apache.jasper.servlet.JasperInitializer。

例如:

<Context containerSciFilter="WsSci" />

禁用WebSocket支持的影响将取决于为WebSocket注释扫描了多少jar文件,以及是否有其他SCIs触发注释扫描。通常,第一次SCI扫描对性能的影响最大。额外扫描的影响很小。

具体操作:tocmat/conf/context.xml <Context>元素添加属性containerSciFilter="WsSci"


二、熵源

Tomcat 7+在很大程度上依赖SecureRandom类为其会话id和其他位置提供随机值。根据您的JRE,如果用于初始化SecureRandom的熵源缺乏熵,它可能会导致启动期间的延迟。当这种情况发生时,你会在日志中看到警告,例如:

<DATE> org.apache.catalina.util.SessionIdGenerator createSecureRandom

INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [5172] milliseconds.

有一种配置JRE使用非阻塞熵源的方法,通过设置以下系统属性:-Djava.security.egd=file:/dev/./urandom

具体操作:配置jdk参数-Djava.security.egd=file:/dev/./urandom


、并行启动多个 web 应用程序

使用 Tomcat 7.0.23 + ,您可以将其配置为并行启动多个 web 应用程序。这在默认情况下是禁用的,但是可以通过将 Host 的 startStopThreads 属性设置为大于1的值来启用

具体操作:tocmat/conf/server.xml <Host>元素添加属性startStopThreads="2",对于多核cpu效果明显


四、其他

1. 内存

调整内存参数-谷歌是你的朋友。

2. 配置

尽可能多地修剪配置文件。XML解析并不便宜。解析的东西越少,速度就会越快。

3. Web应用程序

删除您不需要的任何web应用程序,比如tomcat/webapps下的:examples host-manager manager docs

确保你的代码没有做慢的事情


翻译文章:https://cwiki.apache.org/confluence/display/TOMCAT/HowTo+FasterStartUp

标签: java tomcat startup faster

分享:

下一篇jvisualvm 监控 tomcat

关于我

崇尚极简,热爱技术,喜欢唱歌,热衷旅行,爱好电子产品的一介码农。

座右铭

当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!

人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。

Copyright 2015- 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号

免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。