加快弹簧启动启动时间

2022-08-31 07:09:56

我有一个Spring Boot应用程序。我已经添加了很多依赖项(不幸的是,看起来我需要所有这些依赖项),并且启动时间增加了很多。只需做一个需要10秒钟。SpringApplication.run(source, args)

虽然与“习惯”相比,这可能并不多,但我很高兴它需要这么多,主要是因为它破坏了开发流程。此时,应用程序本身相当小,因此我假设大多数时间与添加的依赖项相关,而不是应用程序类本身。

我假设问题是类路径扫描,但我不确定如何:

  • 确认这是问题所在(即如何“调试”Spring Boot)
  • 如果它真的是原因,我该如何限制它,让它变得更快?例如,如果我知道某些依赖项或包不包含Spring应该扫描的任何内容,那么有没有办法限制它?

我假设在启动期间增强Spring以具有并行bean初始化会加快速度,但是该增强请求自2011年以来一直开放,没有任何进展。我在Spring Boot本身中看到了其他一些努力,例如调查Tomcat JarScanning速度改进,但这是Tomcat特有的,已被放弃。

本文:

虽然针对集成测试,建议使用,但是我不知道如何使用Java配置将其应用于Spring Boot中的所有bean - 这里有任何指针吗?lazy-init=true

欢迎提出任何(其他)建议。


答案 1

Spring Boot做了很多可能不需要的自动配置。因此,你可能希望仅缩小应用所需的自动配置范围。要查看所包含的自动配置的完整列表,只需在 DEBUG 模式下运行 日志记录 ( 在 中 )。另一个选项是运行带有选项的弹簧启动应用程序:org.springframework.boot.autoconfigurelogging.level.org.springframework.boot.autoconfigure=DEBUGapplication.properties--debugjava -jar myproject-0.0.1-SNAPSHOT.jar --debug

输出中会有这样的东西:

=========================
AUTO-CONFIGURATION REPORT
=========================

检查此列表并仅包括您需要的自动配置:

@Configuration
@Import({
        DispatcherServletAutoConfiguration.class,
        EmbeddedServletContainerAutoConfiguration.class,
        ErrorMvcAutoConfiguration.class,
        HttpEncodingAutoConfiguration.class,
        HttpMessageConvertersAutoConfiguration.class,
        JacksonAutoConfiguration.class,
        ServerPropertiesAutoConfiguration.class,
        PropertyPlaceholderAutoConfiguration.class,
        ThymeleafAutoConfiguration.class,
        WebMvcAutoConfiguration.class,
        WebSocketAutoConfiguration.class,
})
public class SampleWebUiApplication {

代码是从这篇博客文章中复制的。


答案 2

到目前为止,投票最多的答案并没有错,但它并没有深入到我喜欢看到的深度,也没有提供任何科学证据。Spring Boot 团队为减少 Boot 2.0 的启动时间进行了一次练习,工单 11226 包含了很多有用的信息。还有一个工单7939开放,可以在条件评估中添加计时信息,但它似乎没有特定的ETA。

调试 Boot 启动的最有用、最有条理的方法是由 Dave Syer 完成的。https://github.com/dsyer/spring-boot-startup-bench

我也有一个类似的用例,所以我采用了Dave与JMH的微基准测试方法,并使用它。结果是引导基准测试项目。我设计它,使它可以用来测量任何Spring Boot应用程序的启动时间,使用由(以前在Boot 1.5中调用)Gradle任务生成的可执行jar。随意使用它并提供反馈。bootJarbootRepackage

我的发现如下:

  1. CPU 很重要。好多。
  2. 使用 -Xverify:none 启动 JVM 有很大帮助。
  3. 排除不必要的自动配置会有所帮助。
  4. Dave 推荐了 JVM 参数 -XX:TieredStopAtLevel=1,但我的测试没有显示出显著的改进。另外,可能会减慢您的第一个请求。-XX:TieredStopAtLevel=1
  5. 报道称主机名解析速度很慢,但我没有发现这对我测试的应用程序来说是一个问题。

推荐