首页 / 资讯中心 / 文章详情

springboot启动耗时分析

springboot启动耗时分析 ★ FEATURED ARTICLE
一、 简介项目优化首先要定位慢在哪里。记录下几个方法。官方的ApplicationStartup的实现类BufferingApplicationStartupFlightRecorderApplicationStartup以及第三方利用ApplicationStartup的工具。对比下来直接用工具更加直观也更方便。二、官方实现的ApplicationStartup 接口Spring Boot 提供了BufferingApplicationStartup、FlightRecorderApplicationStartup两种实现也支持自定义实现该接口。2.1 BufferingApplicationStartup记录启动时各阶段的耗时。使用方法修改启动类publicstaticvoidmain(String[]args){SpringApplicationappnewSpringApplication(SpringbootApplication.class);// 核心设置缓冲区大小比如记录最近 4096 个步骤app.setApplicationStartup(newBufferingApplicationStartup(4096));app.run(args);}打印日志AutowiredprivateBufferingApplicationStartupstartup;GetMapping(/an)publicvoidgetAnalyzer(){AutowiredprivateBufferingApplicationStartupstartup;GetMapping(/an)publicvoidgetAnalyzer(){StartupTimelinetimelinestartup.getBufferedTimeline();// 2. 计算总耗时System.out.println(应用总启动耗时: timeline.getStartTime().toString());// 3. 遍历具体的启动步骤找出最耗时的步骤timeline.getEvents().forEach(event-{longdurationevent.getDuration().toMillis();StartupStepstartupStepevent.getStartupStep();// 只打印耗时超过 600ms 的步骤if(duration100){if(spring.beans.instantiate.equals(startupStep.getName())){for(StartupStep.Tagtag:startupStep.getTags()){if(beanName.equals(tag.getKey())){System.out.println(耗时步骤: startupStep.getName():tag.getValue() 耗时: duration ms);}}}else{System.out.println(耗时步骤: startupStep.getName() 耗时: duration ms);}}});}}日志如下从日志中可以看到关键步骤的耗时以及每个 bean 的创建时间。2.2 FlightRecorderApplicationStartup记录每个bean创建的细节使用方法1、修改启动类publicstaticvoidmain(String[]args){SpringApplicationappnewSpringApplication(SpringbootApplication.class);// 核心设置缓冲区大小比如记录最近 4096 个步骤app.setApplicationStartup(newFlightRecorderApplicationStartup());app.run(args);}2、添加jvm参数java -XX:StartFlightRecording:filenamerecording.jfr,duration60s -jar demo.jar3、启动项目启动成功会本地会生成文件 recording.jfr4、查看内容为什么没有内容我也不知道。试了几个不同方法都不行。谁知道的教教我。三、自定义ApplicationStartup无有这个功能。但是不需要会。已经有现成的工具了下面介绍四、外部工具目前只了解到spring-startup-analyzer后面收到再补充4.1 spring-startup-analyzer它的核心思路是在启动过程中挂载自定义ApplicationStartup实现收集所有StartupStep的耗时数据再在启动结束后汇总成可视化报告因此对业务代码基本无侵入。相比 Spring Boot 自带的ApplicationStartupspring-startup-analyzer 提供的信息更全面不仅能看单个 bean 的创建时间还能做数量统计、方法耗时统计和 jar 包加载统计适合排查「启动慢到底慢在哪」这类问题.使用方法下载最新版本的 jar 包或直接 clone 源码后本地打包。下载链接https://gitcode.com/gh_mirrors/sp/spring-startup-analyzer解压后有五个文件夹应用在liblog有启动日志在启动命令中通过-javaagent挂载该 agentjava-javaagent:/path/to/spring-startup-analyzer.jar\-jaryour-application.jaridel 中可在vm option中添加5. 应用启动完成后agent 会自动生成分析报告并在控制台打印报告文件的访问地址6. 打开报告页面即可查看各阶段耗时、bean 创建明细、方法调用统计和 jar 加载情况。页面说明1、指标数据总耗时总bean数总jar包引入未使用的包类加载器不知道干啥的2、bean耗时排序展示耗时最长的bean支持过滤。3、启动时序图3、调用方法统计方法名次数耗时占比展开详情一些其他配置-Dspring-startup-analyzer.app.health.check.endpointshttp://127.0.0.1:8081/actuator/health手动指定健康节点总结工具好用一点能找到最慢的几个类esbAppHeadResourceResolverbraveHttpServerHandler需要优化的话可以重点关注杂记esbAppHeadResourceResolver 看了下代码会重新扫描项目下包找到配置了对应注解的类。缓存到内存中。时间几乎花在重新扫描上。可以的话这个地方能优化下。
阅读完成 · 觉得有帮助?
咨询建站