• 你的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的启动参数,包括:

    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没试过,就不具体介绍了。感兴趣的童鞋可以根据文档去试试。

    启动优化

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

    第一步:引入依赖

    <dependency>
        <groupId>io.github.linyimin0812groupId>
        <artifactId>spring-async-bean-starterartifactId>
        <version>2.0.2version>
    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。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

  • 相关阅读:
    PCL库点云小知识
    精通Nginx(15)-支持CORS
    微服务和领域驱动
    设置windos电脑开机自动启动chrome浏览器,并且打开指定网页
    一周侃 | 周末随笔
    好心情:别在该躺平的时候动脑子,10种方法让大脑高效休息
    导数求切线
    【JAVA-2】第二章 Java基本语法01:变量与运算符
    webservice接口调用
    JAVA毕业设计110—基于Java+Springboot+Vue的房屋租赁系统小程序(源码+数据库)
  • 原文地址:https://www.cnblogs.com/didispace/p/17576446.html