加快 Spring Boot 启动时间

2024-01-12

我有一个 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 任务。请随意使用它并提供反馈。

我的发现如下:

  1. CPU 很重要。很多。
  2. 启动 JVM-X验证:无 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABHDABI有很大帮助。
  3. 排除不必要的自动配置会有所帮助。
  4. Dave 推荐的 JVM 参数-XX:TieredStopAtLevel=1 https://stackoverflow.com/questions/38721235/what-exactly-does-xx-tieredcompilation-do,但我的测试并没有显示出显着的改善。还,-XX:TieredStopAtLevel=1可能会减慢你的第一个请求。
  5. 曾经有过reports http://blog.noizwaves.io/2017/09/02/slow-spring-boot-startup.html主机名解析速度缓慢,但我没有发现这对我测试的应用程序来说是一个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加快 Spring Boot 启动时间 的相关文章

随机推荐

  • 如何清除chrome应用程序的错误列表?

    首先介绍 Chrome 应用程序 我正在尝试简化某种工作流程 我已启用复选框来收集错误 但似乎无法在应用程序执行之间清除它们 我以为关闭应用程序然后重新启动它就可以了 现在唯一有效的方法是删除应用程序 然后重新加载包 要清除 收集错误 中的
  • 如何覆盖 Razor 的“名称”HtmlAttribute

    Html RadioButtonFor Model gt Model Location Location Html LabelFor Model gt Model Location Location Html RadioButtonFor
  • 在keras中,如何拟合不同类型的多个输入数据

    我有 3000 张 320 320 形状的图像 它们的拍摄时间以及它们的标签 现在我想使用这两种类型的数据 图像和时间 来预测它们的标签 主要代码如下 num classes 10 image out GlobalMaxPooling2D
  • Hibernate: LazyInitializationException: 未能延迟初始化角色集合。无法初始化代理 - 无会话

    我有下一个错误 nested exception is org hibernate LazyInitializationException failed to lazily initialize a collection of role c
  • 如何根据消息头属性仅读取特定队列消息

    我在 activemq 队列中有一个消息列表 每条消息都有一个带有值的自定义标头属性 我应该如何才能仅访问那些自定义标头属性值 123 的消息 我正在使用类似下面的东西从队列中选择消息 如何选择具有 customHeaderProperty
  • 如何处理android中的睡眠模式进入?

    我在任何地方都没有找到它 我该如何处理在android中进入睡眠模式 当Android设备进入睡眠模式时我想做什么 这是可能的还是有办法处理它 只需使用 BroadCastReceivers 进行系统调用 唤醒 睡眠 即可实现此目的 And
  • 如何在MVVM模式中实现INotifyPropertyChanged和observableCollection?

    我在模型中有一个 ObservableCollection of Products 我希望 ViewModel 能够侦听 ObservableCollection of Products 中的任何更改 我不确定如何去实施它 我读过一些教程
  • 查找二叉树中指定节点的路径 (Python)

    我在计算二叉树中从根到指定节点的路径时遇到问题 这是专门针对此问题的 Python 解决方案 这是一个例子 给定下面的二叉树 如果我指定值为 4 的节点 我想返回 1 2 4 如果我指定值为5的节点 我想返回 1 2 5 1 2 3 4 5
  • C++ 对象实例化

    我是一名 C 程序员 正在尝试理解 C 许多教程使用片段演示对象实例化 例如 Dog sparky new Dog 这意味着稍后您将执行以下操作 delete sparky 这是有道理的 现在 在不需要动态内存分配的情况下 是否有任何理由使
  • Visual Studio中有类似Eclipse Perspective的东西吗?

    我想知道 Visual Studio 2008 或 2010 中是否有类似 Eclipse Perspectives 的东西 对于那些不熟悉 Eclipse 的人 这里有一个视角的定义 http www eclipse org articl
  • spplot() 上的国家/地区标签

    我想为 spplot 上的区域添加名称标签 Example load url http gadm org data rda FRA adm0 RData FR lt gadm FR lt spChFIDs FR paste FR rowna
  • spring-context.xml 的位置

    当我在 tomcat 上运行应用程序时 spring context xml 文件位于 WEB inf spring context xml 还行吧 但是运行 junit 测试时 我必须向它提供 spring test context xm
  • Jquery 与原型 magento 冲突 - 我怎样才能分开?

    我似乎无法通过我的 Magento 网站将 jQuery 与 Prototype 分开 我已经使用更改的标签等在 JsFiddle 上工作了 但是当我将它添加到我的 magento 站点时 我不断收到未捕获的语法错误 页面位于http ww
  • C++ 中的接口继承

    我有以下类结构 class InterfaceA virtual void methodA 0 class ClassA public InterfaceA void methodA class InterfaceB public Inte
  • 使用 odp.net 和 C# 中的 OCI 连接到 Oracle

    我一直在阅读有关如何从 C win 应用程序连接到我的 Oracle 数据库的信息 但我一直 碰壁 我决定使用odp net和OCI 这样客户端计算机就不需要安装客户端 但我无法让它工作 我有一个小型测试应用程序 如下所示的代码 在我的解决
  • 试图找出 Windows Workflow 4.5 问题的根源

    我得到的错误是 工作流应用程序已中止 因为加载或 LoadRunnableInstance 操作引发异常 创建一个新的 WorkflowApplication 对象尝试加载另一个工作流实例 我正在使用 workflowapplication
  • Facebook API 获取好友相册对某些好友不起作用

    我正在使用以下 FQL 查询 select src src big from photo where aid in select aid from album where owner contactId and type profile 但
  • 获取 java.lang.NoClassDefFoundError: org/pdfbox/pdfparser/

    下面是我正在使用的代码 我提供了一个 pdf 文件和一个文本文件作为命令行的输入 import org pdfbox cos COSDocument import org pdfbox pdfparser PDFParser import
  • 在 Maven 中本地引用依赖项 jar

    在我的项目中 我使用的外部 jar 不存在于公司的 Maven 存储库中 所以我收到以下错误 Could not resolve dependencies for project Could not find artifact in htt
  • 加快 Spring Boot 启动时间

    我有一个 Spring Boot 应用程序 我添加了很多依赖项 不幸的是 看起来我需要所有这些依赖项 并且启动时间增加了很多 只是做一个SpringApplication run source args 需要 10 秒 虽然与 习惯 相比