当前位置: 首页 > 后端技术 > Java

记得一个春天-启动项目耗时长的优化【从7分钟到1分钟多】

时间:2023-04-01 19:07:18 Java

原因:手头的一个spring项目启动时间比较长,查看时间后总共耗时启动426849毫秒,转换为将近7.11415分钟。1、观察日志初步排查,发现系统卡在这里不动。..2、继续等待日志,发现启动过程中加载阿里数据库连接池DruidDataSource需要将近4分钟。3、因此怀疑是连接池配置的问题。去掉所有初始化参数,保留连接信息(driverClassName,url,username,password)。启动耗时39282毫秒,0.6547分钟4.继续查看连接池配置,释放几个初始化参数,然后重启服务,发现用了将近7分钟,所以可以发现问题出在这里。5.查看Druid官方文档,配置推荐https://github.com/alibaba/dr...查看官网文档:initialSize默认值为0初始化时建立的物理连接数,初始化发生在显示调用时init方法,或者在getConnection第一次初始化的时候初始配置500个数,Spring启动过程会耗费大量的时间来初始化和创建连接,导致系统启动超级慢。准确定位到初始化参数问题导致项目启动耗时这么长。原修改为优化效果如下:系统启动性能优化(耗时对比之前andafter):优化前:spring项目启动耗时426849毫秒,约7分钟。优化后:spring项目启动耗时185613毫秒,约3分钟,启动性能提升2倍以上。极端情况下,开发者可以直接删除本地启动服务时的initialSize参数配置,启动性能可以在原有基础上提升20秒左右。启动这个项目,速度一次可以提升近3分钟。将近3分钟的启动时间对于项目来说还是太长了,继续深度优化。6、监控日志发现加载线程池用了将近10秒(从18s到27s)2022-03-0116:47:18[RMITCPConnection(5)-127.0.0.1]INFObs2.xxxxxxxxx。orm.core.SQLExecutor-2441queryselectfromxxxxxxx2022-03-0116:47:27[RMITCPConnection(5)-127.0.0.1]INFOorg.springframework.xxxxx.concurrent.ThreadPoolTask??Executor-初始化'txxxxkxecutor'配置线程池,初始化的时候直接加载,导致耗时增加,所以修改加载为lazy-init7,继续监控日志,在webApplication初始化的时候停留一分钟多。16:33:40.811[NettyClientSelector_1]调试i.n.u.i.JavassistTypeParameterMatcherGenerator-生成:io.netty.util.internal.__matchers__.com.alibaba.xxxxxmq.remoting.protocol.RemotingCommandMatcher2022-03-0116:34:48连接(-RMI127TCP.0).0.1]INFOorg.springframework.web.context.ContextLoader-RootWebApplicationContext:初始化完成于104988ms2022-03-0116:34:52[RMITCPConnection(3)-127.0.0.1]INFOrsLog-com.baison。bap.resource.StringResourceLoaderstartingload8位于因为springbean加载。启动过程中会加载大量bean类,所以在bean.xml文件中进行了懒加载配置。优化后,耗时达到了1分钟多,现在开机爽了。本次优化效果如下:系统启动性能优化(前后耗时对比):优化前:spring项目启动耗时426849毫秒,约7分钟。优化后:spring项目启动耗时99505毫秒,约1分半钟,启动性能提升近5倍。启动这个项目时,速度一次可以提升近5分钟。平均起来,每天花在启动这些项目上的时间可以节省几十分钟。