我有一个 Spring Boot 应用程序。我添加了很多依赖项(不幸的是,看起来我需要所有这些依赖项)并且启动时间增加了很多。只是做一个SpringApplication.run(source, args)
需要 10 秒。
虽然与“习惯”相比,这可能并不算多,但我很不满意它需要这么多,主要是因为它破坏了开发流程。此时应用程序本身相当小,因此我假设大部分时间与添加的依赖项有关,而不是应用程序类本身。
我认为问题是类路径扫描,但我不知道如何:
- 确认这就是问题所在(即如何“调试”Spring Boot)
- 如果这确实是原因,我该如何限制它,使其变得更快?例如,如果我知道某些依赖项或包不包含 Spring 应该扫描的任何内容,有没有办法限制它?
我假设增强 Spring 在启动期间进行并行 bean 初始化 https://jira.spring.io/browse/SPR-8767会加快速度,但该增强请求自 2011 年以来一直开放,但没有任何进展。我看到了 Spring Boot 本身的一些其他努力,例如研究 Tomcat JarScanning 速度改进 https://github.com/spring-projects/spring-boot/issues/1610,但这是 Tomcat 特有的,已被放弃。
本文:
- http://www.nurkiewicz.com/2010/12/speeding-up-spring-integration-tests.html http://www.nurkiewicz.com/2010/12/speeding-up-spring-integration-tests.html
尽管旨在集成测试,但建议使用lazy-init=true
,但是我不知道如何使用 Java 配置将其应用于 Spring Boot 中的所有 bean - 这里有任何指针吗?
欢迎任何(其他)建议。
其他答案没有深入到我喜欢看到的深度,也没有提供任何科学证据。 Spring Boot 团队进行了一项减少 Boot 2.0 启动时间的练习,并得到了票证11226 https://github.com/spring-projects/spring-boot/issues/11226包含很多有用的信息。还有一张票7939 https://github.com/spring-projects/spring-boot/issues/7939愿意在条件评估中添加计时信息,但似乎没有具体的预计到达时间。
Dave Syer 完成了最有用、最有条理的引导启动调试方法。https://github.com/dsyer/spring-boot-startup-bench https://github.com/dsyer/spring-boot-startup-bench
我也有类似的用例,因此我采用了 Dave 的 JMH 微基准测试方法并运行它。结果是启动基准测试 https://github.com/asarkar/spring/tree/master/boot-benchmark项目。我将其设计为可用于测量任何 Spring Boot 应用程序的启动时间,使用由bootJar
(以前称为bootRepackage
在 Boot 1.5 中)Gradle 任务。请随意使用它并提供反馈。
我的发现如下:
- CPU 很重要。很多。
- 启动 JVM-X验证:无 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABHDABI有很大帮助。
- 排除不必要的自动配置会有所帮助。
- Dave 推荐的 JVM 参数-XX:TieredStopAtLevel=1 https://stackoverflow.com/questions/38721235/what-exactly-does-xx-tieredcompilation-do,但我的测试并没有显示出显着的改善。还,
-XX:TieredStopAtLevel=1
可能会减慢你的第一个请求。
- 曾经有过reports http://blog.noizwaves.io/2017/09/02/slow-spring-boot-startup.html主机名解析速度缓慢,但我没有发现这对我测试的应用程序来说是一个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)