使用性能分析工具定位Spring Boot启动慢问题

背景

项目最近做了大的改动,添加了大量配置,Spring Boot项目启动时间从原来的100秒变成了400秒以上。从大量无效日志中一时难以看出瓶颈所在。首先需要一款性能分析软件,发现Intel® VTune™ Profiler对项目性能影响甚小。

性能分析

VTune是 Intel 提供的一个强大的应用程序性能分析软件,如何使用只需要看这两篇官方教程。(下载需要注册intel账号)
《在windows上面启动》
《分析Java程序》
为了能够在VTune分析Java项目,首先创建一个启动脚本启动项目,然后在VTune创建一个性能分析项目开启性能监控。
start.bat脚本如下,很简单。

 java -jar myboot.jar

在这里插入图片描述
项目启动后结束性能监控,VTune会自动分析监控结果,在Bottom-up Tab页可以看到哪些方法花费了大量CPU时间。
其中Spring的一个matches方法就占用了50秒。

org.springframework.boot.bind.DefaultPropertyNamePatternsMatcher.matches

在这里插入图片描述

性能瓶颈

查阅DefaultPropertyNamePatternsMatcher.matches源码及资料,matches的作用是根据我们在ConfigurationProperties中设置的prefix的值获取对应的匹配项。
由于分库分表后有多个主库与从库,Properties配置了大量不同的数据源。解析这些数据源配置耗费了大量时间,再加上解析后初始化数据源对象。

spring.datasource.url=jdbc:mysql://127.0.0.1:3310/test
spring.datasource.username=root
spring.datasource.password=123456
    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create().type(dataSourceType).build();
    }

根据Spring官方github,matches在匹配prefix值的过程中确实性能欠佳,尤其是prefix越短所花费的匹配时间越长。
详见:spring boot startup performance issue when large properties file

改善

matches性能问题在Spring Boot 2中已经得到改善,但项目升Spring Boot 2遥遥无期。
既然瓶颈在过多的prefix,首先可以减少prefix配置但治标不治本。最终解决方法为本地调试绕过Spring matches方法,改用测试插件去初始化数据源,将项目启动时间从400秒压缩为100秒左右。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值