慢在哪里?

使用IDEA的Async Profiler进行分析:

第一个图是火焰图,Y轴代表调用栈,每一层都是一个函数,调用栈越深,火焰越高,顶部的就是正在执行的函数,下方都是他的父函数;X轴表示抽样数,一个函数在X轴占据的宽度越宽,表示他被抽到的次数越多,即执行的时间越长。

image-20221016160521651

第二个标签是调用树(Call Tree),展示了在每个方法中子方法的耗时占比(严格的说是CPU sample占比)

image-20221016160835031

怎么优化启动速度?

减少业务初始化

没有必要启动就初始化的业务能异步就异步。

延迟初始化

spring.main.lazy-initialization=true配置后所有的bean都将延迟初始化,这个会一定程度上提高启动速度,但是会导致第一次访问时较慢。

使用indexer

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-indexer</artifactId>
        <optional>true</optional>
    </dependency>

主要作用是解决在类扫描时避免类过多导致扫描速度过慢的问题。

使用方式:导入依赖=》在启动类上面写上@Indexed注解,这样在程序编译打包之后会生成META-lNT/spring.components文件,当执行’ComponentScan’扫描类时会读取索引文件提高扫描速度。

关闭JMX

spring.jmx.enabled=false

springboot 2.2以下的版本默认会开启jmx

关闭分层编译

Java8以后的版本默认打开多层编译,使用命令查看

java -XX:+PrintFlagsFinal -version | grep CompileThreshold

==不建议在线上环境使用==

参考/原文: