可通过启用spring boot启动指标、actuator startup端点、jvm类加载参数及3.2+的startup probes,精准分析类加载与bean初始化耗时占比。

可以通过启用 Spring Boot 的启动指标(Startup Time Metrics)功能,结合 JVM 层面的类加载与初始化日志,实时捕获并分析类解析(class loading)与 Bean 初始化(bean instantiation)在整体启动过程中的耗时分布。
开启启动指标与详细日志
在 application.properties 中添加以下配置:
- spring.application.admin.enabled=true —— 启用应用管理端点(可选,便于后续集成监控)
- logging.level.org.springframework.boot.StartupInfoLogger=DEBUG —— 输出启动阶段关键时间节点
- logging.level.org.springframework.context.support.AbstractApplicationContext=DEBUG —— 显示上下文刷新各阶段耗时
- -Dsun.misc.URLClassPath.debug=true(JVM 参数)—— 输出类路径扫描与类加载细节(仅调试环境启用,较重)
启用 Spring Boot Actuator 的 startup 端点
引入 actuator 依赖后,访问 /actuator/startup(需配置 management.endpoints.web.exposure.include=startup),可获取结构化启动事件链,包含:
- ApplicationContextInitializedEvent:上下文创建完成时间
- ApplicationPreparedEvent:环境准备就绪
- ContextRefreshedEvent:refresh 阶段结束,即 Bean 初始化完成
- 每个事件附带时间戳和持续时间,能直观看出 refresh 阶段(含类解析、扫描、Bean 创建)占总启动时间的比例
配合 JVM 类加载统计参数
添加 JVM 启动参数,获取底层类加载行为数据:
- -XX:+TraceClassLoading —— 打印每个类被加载的时刻(输出到 stdout 或日志)
- -XX:+TraceClassLoadingPreorder —— 显示类加载依赖顺序,辅助识别初始化瓶颈
- -XX:+PrintGCDetails -XX:+PrintGCTimeStamps —— 排除 GC 干扰,确认耗时是否源于内存压力导致的类加载延迟
将这些日志与 startup 端点的时间戳对齐,即可估算出类加载与初始化阶段的实际占比(例如:从 ApplicationPreparedEvent 到 ContextRefreshedEvent 耗时 3200ms,期间 JVM 日志显示类加载集中发生于前 2100ms,则占比约 66%)。
使用 Spring Boot 3.2+ 的 Startup Probes(推荐)
若项目已升级至 Spring Boot 3.2 及以上版本,可启用内置的启动探针:
- 配置 spring.profiles.active=probes
- 通过 /actuator/probes 获取细粒度阶段耗时,包括
class-path-scanning、auto-configuration-processing、bean-instantiation等命名阶段 - 该数据支持导出为 Micrometer 指标,可接入 Prometheus 实时观察占比变化










