你的Spring应用启动很慢?不妨试试这个工具!
睡不着闲逛,在GitHub上看到一个挺实用的开源项目:Spring Startup Analyzer。
从项目名称中就大概能猜到,这是一个分析Spring应用启动过程的工具。Spring Startup Analyzer通过采集Spring应用启动过程的数据,进而生成一个交互式的分析报告,帮助用户发现Spring应用启动慢的位置。
同时,Spring Startup Analyzer还提供了Spring Bean异步初始化的工具,来帮助开发者加快Spring应用的启动时间。
下面一起来看看其提供的强大功能。
分析能力
我们可以先从该项目中给出HTML样例报告来看看它所提供的分析功能。感兴趣的可以通过下面链接访问:
把报告内容的细节部分都收起来,可以看到如下图所示的内容:
主要有六个部分:
- 启动的统计数据。其中包括:启动时间、Bean的数量、使用/总共的JAR包数量、未使用/总共的JAR包数量、ClassLoader数量
- Spring Bean初始化数据。这里采集了每个Spring Bean的初始化时间及其细节内容
- Bean初始化时间线。通过时间线的方式,清晰地展现了Spring应用启动时候,各个Bean的顺序关系以及时间消耗
- 方法调用的详细信息。这里统计了每个方法的调用时间、总时间开销和每次调用的平均时间
点开之后,还能看到具体每次调用时候的时间开销和一些调用细节:
- 启动后未使用的JAR。列出了所有Spring应用启动后没有使用的jar包,可以有效的帮助你清理不需要的依赖,为应用瘦身
- 应用启动过程的线程火焰图
如何使用
通过上面的介绍,相信你已经了解该工具的强大之处了。接下来就可以通过下面的方法尝试分析一下自己的应用吧:
第一步:从里面的链接中下载最新的安装包
https://github.com/linyimin0812/spring-startup-analyzer/tags
第二步:解压下载的安装包,记住解压后的路径,下面一步要用
第三步:编辑Spring Boot的启动参数,包括:
- 该工具采用agent的方式启动,所以要添加参数
-javaagent:$HOME/spring-startup-analyzer/lib/spring-profiler-agent.jar
,这里$HOME
代表以前的解压路径,记得根据上面解压后的路径编辑这个参数 - 配置分析工具的参数,这里根据自己需要添加即可,比如可以配置超时时间30分钟:
-Dspring-startup-analyzer.app.health.check.timeout=30
,其他可配置项如下表,你可以工具自己应用的情况去修改:
第四步:查看该工具的日志,可以通过$HOME/spring-startup-analyzer/logs
路径,这里$HOME
代表以前的解压路径,日志文件的类别为:
- startup.log: 启动过程中的日志
- transform.log: 被re-transform的类/方法信息
另外,该工具还支持自定义扩展,这里DD没试过,就不具体介绍了。感兴趣的童鞋可以根据文档去试试。
启动优化
这里提到了一个启动加速的优化思路,就是把一些耗时的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被调用,否则可能会存在问题
好了,今天的学习就到这里!如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!
最后,奉上项目地址:https://github.com/linyimin0812/spring-startup-analyzer
欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
MGR 主备集群实现异步连接故障转移
1.概述 MySQL 8.0.22 开始,支持异步连接故障切换机制,在现有主从复制连接失败后,自动建立到新主的异步复制连接。 MySQL 8.0.23 开始,异步连接故障切换机制还支持组复制拓扑,通过自动监视组成员身份的更改并区分主节点和从节点,在组复制主节点故障选出新主节点后,自动建立到新主的异步复制连接。 MySQL 8.0.26 开始,组复制可以设置组成员在特定情况下采取的操作,比如成员操作 mysql_disable_super_read_only_if_primary 当选择一个新的primary时,使处于单主模式的组保持超级只读模式,这样该组只接受复制的事务,不接受来自客户端的任何直接写操作。 MySQL 8.0.27 开始,异步连接故障切换机制还允许组复制作为副本,组的主节点发生故障时,新的主节点自动重新连接到源端。新增成员操作mysql_start_failover_channels_if_primary,默认情况下,此成员操作是启用的,当启用此成员动作时,在"CHANGE replication SOURCE TO"语句中为复制通道设置SOURCE_CONNECTIO...
- 下一篇
搜狗输入法双击输入框崩溃问题 | 京东云技术团队
前言: 每当到618、双11这样大促的时候,搜索作为整个App的核心功能,不仅担当着流量入口,还承载着用户感知到这个产品在导购场景中的服务与体验,所以保障搜索以便更好的助力618大卖。 现象: 搜狗输入框双击调起键盘crash 监控平台: 监控平台检测到大量的crash,现象都为在极短的时间间隔内键盘响应问题 心路历程: 通过观察现象,猜测应该是用户通过微信或别的软件中复制关键词,然后来到京东万商进行粘贴搜索功能。可能由于一些原因(未弹出复制权限提示弹窗)导致搜索框没有出现粘贴功能,此时用户疯狂双击输入框导致的。于是开始测试市面上的App,以京东App为例,复现步骤如下: 测试结果如下表: App 是否崩溃 频率 京东 是 高 京东万商 是 高 七鲜 是 高 淘宝 否 支付宝 是 中 百度 是 中 百度地图 否 美团 否 盒马 否 1688 否 哔哩哔哩 否 抖音 是 低 通过手机隐私拿到的崩溃日志,分别为京me、京东、百度,表现与SGM平台表象一样 源码调试: 通过Xcode断点调试结果如下图: UICompatibilityInputViewController过度release ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19