You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetty 12.1.4启动耗时优化求助:QuickStart模块未生效

Jetty 12.1.4 (Eclipse Temurin 11) 启动延迟优化方案

一、先定位耗时瓶颈

  • 开启Jetty启动跟踪日志,在start.ini中添加:
    org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
    org.eclipse.jetty.level=DEBUG
    
    重点查看每个WebAppContext.start()的执行耗时,定位是类加载、依赖扫描、框架初始化(如Spring)还是JSP处理拖慢了启动。
  • 启用JVM GC日志排查停顿:
    -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDetails -Xloggc:./gc-startup.log
    
    分析启动阶段是否有频繁GC导致的延迟。

二、配置层面优化

1. 关闭不必要的注解扫描

  • 在每个war的web.xml中添加<web-app metadata-complete="true">,禁止Jetty扫描类路径查找Servlet/Filter/Listener注解;或者在上下文XML中配置:
    <Set name="metadataComplete">true</Set>
    

2. 优化类加载策略

  • 将多个war共享的依赖jar放到Jetty的lib/ext目录,避免重复加载;同时在上下文XML中设置:
    <Set name="parentLoaderPriority">true</Set>
    
    优先使用父类加载器加载共享依赖,减少每个war的类加载时间。

3. 精细化QuickStart配置

  • 用Jetty的quickstart-maven-plugin为每个war提前生成WEB-INF/quickstart-web.xml,明确指定需要启动的Servlet、Filter、Listener,避免自动扫描。示例插件配置:
    <plugin>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>quickstart-maven-plugin</artifactId>
      <version>12.1.4</version>
      <executions>
        <execution>
          <goals>
            <goal>generate</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    
  • 强制使用QUICKSTART模式,在上下文XML中设置:
    <Call name="setAttribute">
      <Arg>org.eclipse.jetty.quickstart.mode</Arg>
      <Arg>QUICKSTART</Arg>
    </Call>
    

4. 彻底禁用JSP冗余操作

  • 确认JSP已预编译完成后,在上下文XML中同时设置:
    <Call name="setAttribute">
      <Arg>org.eclipse.jetty.jsp.precompiled</Arg>
      <Arg>true</Arg>
    </Call>
    <Call name="setAttribute">
      <Arg>org.eclipse.jetty.jsp.scan</Arg>
      <Arg>false</Arg>
    </Call>
    

5. 调整启动线程池

  • 在start.ini中增加线程池配置,避免启动时线程阻塞:
    jetty.threadPool.minThreads=20
    jetty.threadPool.maxThreads=200
    jetty.threadPool.idleTimeout=60000
    

三、部署策略调整

1. 并行部署多个WebApp

  • 在start.ini中启用并行部署:
    deploy.parallel=true
    deploy.parallel.maxThreads=8
    
    让多个war同时启动,替代默认的串行启动逻辑。

2. 延迟非核心应用启动

  • 对非核心应用的上下文XML设置lazyInit="true",让应用在第一次请求时才初始化:
    <Set name="lazyInit">true</Set>
    
  • 或者通过startupOrder控制启动顺序,核心应用设为低数值优先启动:
    <Set name="startupOrder">1</Set>
    

3. 合并同类应用

  • 如果18个war业务逻辑相似,可合并为一个多上下文应用,减少WebAppContext的初始化次数。

四、JVM层面优化

  • 配置足够的堆内存与元空间,避免启动时频繁GC:
    -Xms2g -Xmx2g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g
    
  • 启用类数据共享(CDS),提前生成共享类归档:
    1. 首次启动Jetty时添加参数:-XX:+UseAppCDS -XX:DumpLoadedClassList=./jetty-classes.lst
    2. 生成归档文件:java -XX:+UseAppCDS -XX:SharedClassListFile=./jetty-classes.lst -XX:SharedArchiveFile=./jetty.jsa -jar start.jar
    3. 后续启动时添加:-XX:+UseAppCDS -XX:SharedArchiveFile=./jetty.jsa
  • 禁用字节码验证(生产环境需评估安全风险):
    -Xverify:none
    

内容的提问来源于stack exchange,提问作者S C A R Y G O D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 17:12:36