Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加快Spring启动时间_Java_Performance_Spring Boot_Startup - Fatal编程技术网

Java 加快Spring启动时间

Java 加快Spring启动时间,java,performance,spring-boot,startup,Java,Performance,Spring Boot,Startup,我有一个Spring启动应用程序。我添加了很多依赖项(不幸的是,看起来我需要所有依赖项),启动时间增加了很多。仅仅做一个SpringApplication.run(source,args)需要10秒 虽然这与我们“习惯”的东西相比可能不算多,但我很不高兴需要这么多,主要是因为它破坏了开发流程。此时,应用程序本身相当小,因此我假设大部分时间与添加的依赖项有关,而不是应用程序类本身 我假设问题是类路径扫描,但我不确定如何: 确认这就是问题所在(即如何“调试”Spring引导) 如果它真的是原因,我

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

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

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

  • 确认这就是问题所在(即如何“调试”Spring引导)
  • 如果它真的是原因,我如何限制它,使它变得更快?例如,如果我知道某个依赖项或包不包含Spring应该扫描的任何内容,有没有办法限制它
我认为这会加快速度,但该增强请求自2011年以来一直处于开放状态,没有任何进展。我在SpringBoot本身中看到了一些其他的努力,例如,但这是Tomcat特有的,已经被放弃了

本文:

虽然针对集成测试,建议使用
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启动应用程序的启动时间。请随意使用它并提供反馈

我的调查结果如下:

  • CPU很重要。很多
  • 使用启动JVM有很大帮助
  • 排除不必要的自动配置会有所帮助
  • Dave建议使用JVM参数,但我的测试并没有显示出显著的改进。另外,
    -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);
              }
          }
        }