Redian新闻
>
你的Spring Boot应用启动很慢?不妨试试这个神器!

你的Spring Boot应用启动很慢?不妨试试这个神器!

公众号新闻


国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 项目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn

来源:程序猿DD


睡不着,半夜闲逛,在GitHub上看到一个挺实用的开源项目:Spring Startup Analyzer

从项目名称中就大概能猜到,这是一个分析Spring应用启动过程的工具。Spring Startup Analyzer通过采集Spring应用启动过程的数据,进而生成一个交互式的分析报告,帮助用户发现Spring应用启动慢的位置。

同时,Spring Startup Analyzer还提供了Spring Bean异步初始化的工具,来帮助开发者加快Spring应用的启动时间。

下面一起来看看其提供的强大功能。

分析能力

我们可以先从该项目中给出HTML样例报告来看看它所提供的分析功能。感兴趣的可以通过下面链接访问:

  • https://linyimin-blog.oss-cn-beijing.aliyuncs.com/spring-satrtup-analyzer/hokage-20230618000928-192.168.0.101-analyzer.html

把报告内容的细节部分都收起来,可以看到如下图所示的内容:

主要有六个部分:

  • 启动的统计数据。其中包括:启动时间、Bean的数量、使用/总共的JAR包数量、未使用/总共的JAR包数量、ClassLoader数量
  • Spring Bean初始化数据。这里采集了每个Spring Bean的初始化时间及其细节内容
  • Bean初始化时间线。通过时间线的方式,清晰地展现了Spring应用启动时候,各个Bean的顺序关系以及时间消耗
  • 方法调用的详细信息。这里统计了每个方法的调用时间、总时间开销和每次调用的平均时间

点开之后,还能看到具体每次调用时候的时间开销和一些调用细节:

  • 启动后未使用的JAR。列出了所有Spring应用启动后没有使用的jar包,可以有效的帮助你清理不需要的依赖,为应用瘦身
  • 应用启动过程的线程火焰图

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

如何使用

通过上面的介绍,相信你已经了解该工具的强大之处了。接下来就可以通过下面的方法尝试分析一下自己的应用吧:

第一步:从里面的链接中下载最新的安装包

https://github.com/linyimin0812/spring-startup-analyzer/tags

第二步:解压下载的安装包,记住解压后的路径,下面一步要用

第三步:编辑Spring Boot的启动参数,包括:

  1. 该工具采用agent的方式启动,所以要添加参数-javaagent:$HOME/spring-startup-analyzer/lib/spring-profiler-agent.jar,这里$HOME代表以前的解压路径,记得根据上面解压后的路径编辑这个参数
  2. 配置分析工具的参数,这里根据自己需要添加即可,比如可以配置超时时间30分钟:-Dspring-startup-analyzer.app.health.check.timeout=30,其他可配置项如下表,你可以工具自己应用的情况去修改:

第四步:查看该工具的日志,可以通过$HOME/spring-startup-analyzer/logs路径,这里$HOME代表以前的解压路径,日志文件的类别为:

  • startup.log: 启动过程中的日志
  • transform.log: 被re-transform的类/方法信息

另外,该工具还支持自定义扩展,这里DD没试过,就不具体介绍了。感兴趣的童鞋可以根据文档去试试。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

启动优化

这里提到了一个启动加速的优化思路,就是把一些耗时的Bean初始化改成异步就能实现。该项目提供了Bean的异步初始化工具,也非常好用,只需要下面几步就能完成。

第一步:引入依赖

<dependency>
    <groupId>io.github.linyimin0812</groupId>
    <artifactId>spring-async-bean-starter</artifactId>
    <version>2.0.2</version>
</dependency>

第二步:配置参数

# 异步化的Bean可能在Spring Bean初始化顺序的末尾,导致异步优化效果不佳,打开配置优先加载异步化的Bean
spring-startup-analyzer.boost.spring.async.bean-priority-load-enable=true
# 指定异步的Bean名称
spring-startup-analyzer.boost.spring.async.bean-names=testBean,testComponent
# 执行异步化Bean初始化方法线程池的核心线程数
spring-startup-analyzer.boost.spring.async.init-bean-thread-pool-core-size=8
# 执行异步化Bean初始化方法线程池的最大线程数
spring-startup-analyzer.boost.spring.async.init-bean-thread-pool-max-size=8

第三步:检查Bean是否异步初始化。查看日志$HOME/spring-startup-analyzer/logs/startup.log文件,对于异步执行初始化的方法,会按照以下格式写一条日志:

async-init-bean, beanName: ${beanName}, async init method: ${initMethodName}

但是,作者在文档中也提到了,异步并不是万能的,你还需要注意以下这几点:

  • 应该优先从代码层面优化初始化时间长的Bean,从根本上解决Bean初始化耗时长问题
  • 对于二方包/三方包中初始化耗时长的Bean(无法进行代码优化)再考虑Bean的异步化
  • 对于不被依赖的Bean可以放心进行异步化,可以通过各个Bean加载耗时中的Root Bean判断Bean是否被其他Bean依赖
  • 对于被依赖的Bean需要小心分析,在应用启动过程中不能其他Bean被调用,否则可能会存在问题

最后,奉上项目地址:https://github.com/linyimin0812/spring-startup-analyzer



欢迎加入我的知识星球,全面提升技术能力。

加入方式,长按下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
六四、天安门—不能忘却的记忆SpringBoot 中的自带工具类,开发效率倍增!SpringBoot 快速实现IP地址解析推荐35款 SpringBoot/SpringCloud 开源项目,附源码三分钟了解 SpringBoot 的启动流程君子如今不值錢Spring Boot 整合分布式消息平台 PulsarSpringBoot 调用外部接口的三种方式人到中年就发福?不如试试这三十五 表扬SpringBoot 插件化开发模式,强烈推荐!大公司为什么禁止在 Spring Boot 项目中使用 @Autowired 注解?一个音乐弥漫的午后想贴秋瞟,又想不长肉?不如试试这!6种方式读取Springboot的配置Vue+SpringBoot 集成 PageOffice 实现在线编辑Word、excel文档绝望时,不妨试试这些解压方式基于 SpringBoot 实现多租户架构:支持应用多租户部署和管理SpringBoot项目中使用缓存的正确姿势,太优雅了!适用于古老的Windows 3.1 PC的ChatGPT应用程序WinGPTSpringBoot 集成 EasyExcel 3.x 优雅实现 Excel 导入导出只会用 Spring Boot 创建微服务?那你就 OUT 了,还有这 4 种替代方案!研一医学生现状曝光!综述写不好,整天被导师pua,不妨试试10篇高分综述!穿腻了普通T恤,不妨试试这件冰丝针织polo衫!可甜可盐,承包你夏季的整个穿搭~SpringBoot 集成 Camunda 流程引擎,实现一套完整的业务流程别再用 kill -9 了,这才是 Spring Boot 停机的正确方式!!!快试试用 API Key 来保护你的 SpringBoot 接口安全吧公司入职一大佬,把Spring Boot系统启动时间从 7分钟降到了 40秒!面试官:Feign第一次调用为什么会很慢?面试官:Feign 第一次调用为什么会很慢?大部分人都答不上来!SpringBoot 整合 MinIO 实现视频的分片上传/断点续传(亲测可行)在语言触及不到的地方,不妨试试音乐治疗 | 音乐治疗明天开课SpringBoot 接口快速开发神器(接口可视化界面实现)三十六 申请书SpringBoot+Mybatis 如何实现流式查询,你知道吗?
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。