gpt4 book ai didi

java - Jetty 启动需要多长时间?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:52:40 25 4
gpt4 key购买 nike

启动 Jetty 在我的 Web 应用程序开始加载之前有很长的延迟(8 秒)

13:50:10 [INFO] jetty-9.4.5.v20170502
13:50:18 [INFO] Scanning elapsed time=146ms

启用调试日志记录后,有两个有趣的步骤

  • 提取依赖的war-application,毕竟需要时间(3s)

    10:03:13 [DEBUG] Extracting entry = null from jar file:[..]/application-1.0.war
    10:03:16 [DEBUG] Unpacked overlay: jar:file:[..]/application-1.0.war!/ to file:[..]
  • 以及以下 4 秒的延迟:

    10:03:16 [DEBUG] Service loaders found in 0ms
    10:03:20 [DEBUG] loaded interface javax.servlet.ServletContainerInitializer

我如何调试或影响导致超过 4 秒延迟的原因?


配置

pom.xml

<dependency>
<groupId>com.company</groupId>
<artifactId>application</artifactId>
<version>1.0</version>
<type>war</type>
</dependency>

[...]

<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.5.v20170502</version>
<configuration>
<webApp>
<webInfIncludeJarPattern>empty</webInfIncludeJarPattern>
<containerIncludeJarPattern>empty</containerIncludeJarPattern>
</webApp>
</configuration>
</plugin>

web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">

<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.app.AnnotationConfig</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

[...]

</web-app>

最佳答案

你有一个比平均水平更大的 webapp(70MB 的 WEB-INF/lib jar),但没有什么特别大的(我见过 800MB 的 war 文件)

发生的一些事情可能会导致速度变慢。

  1. 将 war 解压到 WebApp 临时目录
  2. 将资源 jar ( WEB-INF/lib/*.jar!/META-INF/resources/) 解压到 WebApp 临时目录
  3. Jar 字节码扫描(用于在 @HandlesType 类上的 javax.servlet.ServletContainerInitializer 注释中声明的注释和类型)

如果您的文件系统很慢,那么以上任何一项都会减慢您的速度。

Note: the DEBUG logging of Jetty will tell you the timing of each of those (even breaking down the timing of bytecode scanning timing to the individual jar)

字节码扫描步骤是最常影响启动时间的地方。

配置<containerIncludeJarPattern>不推荐使用“empty”,这是 Servlet、JSP、Taglib 运行所必需的。

The containerIncludeJarPattern default无论如何只是 servlet/jsp/taglib jar 。 (扫描需要几微秒)

<webInfIncludeJarPattern>也不应该只是“空”,它至少应该包括你的 WEB-INF/classes内容(又名 .*/classes/.* )。考虑将其设置为仅扫描那些 WEB-INF/lib你需要的 jar 。 (类似 .*/lib/spring-.*\.jar$|.*/classes/.* )

WEB-INF/lib/*.jar 中类的大小(以字节为单位)和 WEB-INF/classes实际上是无关紧要的。与时间更相关的是找到的文件数量(甚至是非类文件)。

如果您使用资源 jar (WEB-INF/lib/*.jar!/META-INF/resources/),那么这是一个严重的惩罚/缓慢启动的根源。

您可以做什么:

首先查看您的 DEBUG 日志,它会告诉您哪里有问题。

接下来,使用 quickstart 进行调查如果启动时间很重要,Jetty 的功能(它有 2 个部分,一个构建时组件,用于扫描和构建包含在您的 war 中的 jetty-quickstart.xml,以及一个运行时模块,用于查找并使用 jetty-quickstart.xml(如果找到)

最后,如果您使用的是资源 jar (WEB-INF/lib/*.jar!/META-INF/resources/),请考虑将这些内容移出 WEB-INF/lib。并在构建过程中进入 war 中的正常位置(maven 中的 package 阶段)。这些很方便,但有许多您似乎不喜欢的副作用。 (还要考虑运行时资源解析冲突的问题)。

关于java - Jetty 启动需要多长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45590429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com