Java 加快Spring启动时间
我有一个Spring启动应用程序。我添加了很多依赖项(不幸的是,看起来我需要所有依赖项),启动时间增加了很多。仅仅做一个Java 加快Spring启动时间,java,performance,spring-boot,startup,Java,Performance,Spring Boot,Startup,我有一个Spring启动应用程序。我添加了很多依赖项(不幸的是,看起来我需要所有依赖项),启动时间增加了很多。仅仅做一个SpringApplication.run(source,args)需要10秒 虽然这与我们“习惯”的东西相比可能不算多,但我很不高兴需要这么多,主要是因为它破坏了开发流程。此时,应用程序本身相当小,因此我假设大部分时间与添加的依赖项有关,而不是应用程序类本身 我假设问题是类路径扫描,但我不确定如何: 确认这就是问题所在(即如何“调试”Spring引导) 如果它真的是原因,我
SpringApplication.run(source,args)
需要10秒
虽然这与我们“习惯”的东西相比可能不算多,但我很不高兴需要这么多,主要是因为它破坏了开发流程。此时,应用程序本身相当小,因此我假设大部分时间与添加的依赖项有关,而不是应用程序类本身
我假设问题是类路径扫描,但我不确定如何:
- 确认这就是问题所在(即如何“调试”Spring引导)
- 如果它真的是原因,我如何限制它,使它变得更快?例如,如果我知道某个依赖项或包不包含Spring应该扫描的任何内容,有没有办法限制它李>
lazy init=true
,但我不知道如何使用Java配置将其应用于Spring Boot中的所有bean—这里有指针吗
欢迎提出任何(其他)建议。对我来说,听起来您使用了错误的配置设置。 首先检查myContainer和可能的冲突。 要确定谁使用了最多的资源,您必须一次检查每个依赖项的内存映射(请参见数据量!),这也需要大量的时间。。。(和SUDO特权)。
顺便问一下:您通常是根据依赖项测试代码吗?Spring Boot会进行很多可能不需要的自动配置。因此,您可能只想缩小应用程序所需的自动配置范围。要查看包含的自动配置的完整列表,只需在调试模式下运行
org.springframework.boot.autoconfigure
(logging.level.org.springframework.boot.autoconfigure=DEBUG
中的application.properties
)。另一个选项是使用--debug
选项运行spring启动应用程序:java-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 {
代码是从中复制的。如本问题/答案中所述,我认为最好的方法是排除您知道不需要的依赖项,而不是只添加您认为需要的依赖项 见: 总之: 您可以看到封面下发生了什么,并启用调试日志记录,只需在从命令行启动应用程序时指定--debug即可。您还可以在application.properties中指定debug=true 此外,您还可以在application.properties中设置日志记录级别,如下所示: logging.level.org.springframework.web:调试 logging.level.org.hibernate:错误 如果检测到不需要的自动配置模块,则可以将其禁用。可在以下位置找到相关文档: 例如:
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
到目前为止,投票最多的答案没有错,但它没有深入到我喜欢看到的深度,也没有提供任何科学证据。SpringBoot团队进行了一次练习,以缩短Boot2.0的启动时间,该票包含了很多有用的信息。还有一张票可以在状态评估中添加时间信息,但似乎没有具体的ETA Dave Syer完成了调试启动的最有用、最系统的方法 我也有一个类似的用例,所以我采用了Dave用JMH进行微观基准测试的方法并使用它运行。结果就是这个项目。我将其设计为可以使用
bootJar
(以前在boot1.5中称为bootRepackage
)Gradle任务生成的可执行jar来测量任何Spring启动应用程序的启动时间。请随意使用它并提供反馈
我的调查结果如下:
-XX:TieredStopAtLevel=1
可能会减慢您的第一个请求如果您试图优化手动测试的开发周转,我强烈建议使用 使用spring boot开发工具的应用程序将自动重新启动 每当类路径上的文件发生更改时 只要重新编译——服务器就会自动重启(对于Groovy,您只需要更新源文件)。如果您使用的是IDE(例如“vscode”),它可能会自动编译您的java文件,因此只需保存一个java文件就可以间接地启动服务器重启——java在这方面与Groovy一样无缝 这种方法的美妙之处在于,增量重启缩短了一些从头开始的启动步骤——因此,您的服务将能够更快地备份和运行
不幸的是,这对部署或自动单元测试的启动时间没有帮助。我觉得奇怪,以前没有人建议过这些优化。以下是开发时优化项目构建和启动的一些一般提示:
- 从防病毒扫描程序中排除开发目录:
- 项目目录
- 生成输出目录(如果在项目目录之外)
- IDE索引目录(例如~/.IntelliJIdea2018.3)
- 直接部署
INFO 5024 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 23331 ms INFO 5024 --- [restartedMain] b.n.spring.Application : Started Application in 54.251 seconds (JVM running for 63.766)
INFO 10288 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 9863 ms INFO 10288 --- [restartedMain] b.n.spring.Application : Started Application in 32.058 seconds (JVM running for 37.625)
public class LazyInitBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { for (String beanName : beanFactory.getBeanDefinitionNames()) { BeanDefinition definition = beanFactory.getBeanDefinition(beanName); definition.setLazyInit(true); } } }