You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3.5.4 + JDK 24 AOT缓存启动频繁挂死的诊断与解决求助

Spring Boot 3.5.4 + JDK 24 AOT缓存启动频繁挂死的诊断与解决求助

我最近在折腾Spring Boot 3.5.4 + JDK 24的AOT缓存(不是原生编译,就是单纯用AOT缓存加速启动),遇到了一个特别头疼的问题——应用启动时经常挂死,只有大概20%的概率能正常启动(这时候启动确实符合预期的更快),剩下80%直接卡着不动,启动时间等于无限长。

我的环境与AOT缓存构建流程

先跟大家说下我的具体配置和缓存构建步骤:

  • 应用用Spring Boot 3.5.4 + JDK 24开发,用Maven Jib打包容器镜像
  • AOT缓存的构建流程是这样的:
    1. 先构建标准的Spring Boot fat jar
    2. 在目标容器的同版本Java 24基础镜像里,用-Djarmode=tools解压这个jar
    3. 把解压后的myapp.jar和lib目录复制到容器的/app目录下
    4. 先以AOTMode=record运行应用,再切换到AOTMode=create生成AOT缓存(流程类似官方推荐的方式)
    5. 把所有文件的时间戳设为Unix纪元起始(因为Jib对文件时间戳有要求)
  • 最终的容器镜像里包含/app/myapp.jar、/app/app.aot(生成的AOT缓存)和/app/lib下的所有依赖包,自定义启动命令是:
    java -XX:AOTCache=/app/app.aot -jar /app/myapp.jar
    
    这个命令确实能成功加载AOT缓存,但启动稳定性完全没法用。

挂死现象与线程dump分析

每次挂死时,应用都卡在main启动线程上,我抓了多次线程dump,每次都指向同一个调用栈,线程状态显示是RUNNABLE但完全没有进展。典型的线程dump如下:

"main" #3 [5925] prio-5 os_prio=0 cpu=32236.90ms elapsed=36.51s tid=0x00007f1a2802bb00 nid=5925 runnable [0x00007fla2e085000]
java.lang.Thread.State: RUNNABLE
	at java.lang.invoke.DirectMethodHandleHolder.invokeStatic(java.base@24.0.2/DirectMethodHandleHolder)
	at java.lang.invoke.DelegatingMethodHandleHolder.delegate (java.base@24.0.2/DelegatingMethodHandleHolder)
	at java.lang.invoke.BootstrapMethodInvoker.invoke(java.base@24.0.2/BootstrapMethodInvoker.java:102)
	at java.lang.invoke.CallSite.makeSite (java.base@24.0.2/CallSite.java:310)
	at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(java.base@24.0.2/MethodHandleNatives.java:250)
	at java.lang.invoke.MethodHandleNatives.linkCallSite (java.base@24.0.2/MethodHandleNatives.java:240)
	at org.springframework.web.servlet.handler.AbstractHandlerMapping.formatMappingName (AbstractHandlerMapping.java:406)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.handlerMethodsInitialized (AbstractHandlerMethodMapping.java:366)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods (AbstractHandlerMethodMapping.java:227)

偶尔也会遇到卡在Tomcat启动阶段的情况,线程栈类似:

java.lang.Thread.State: RUNNABLE
	at java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.base@24.0.2/DirectMethodHandle$Holder)
	at java.lang.invoke.DelegatingMethodHandle$Holder.delegate(java.base@24.0.2/DelegatingMethodHandle$Holder)
	at java.lang.invoke.BootstrapMethodInvoker.invoke(java.base@24.0.2/BootstrapMethodInvoker.java:102)
	at java.lang.invoke.CallSite.makeSite(java.base@24.0.2/CallSite.java:310)
	at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(java.base@24.0.2/MethodHandleNatives.java:250)
	at java.lang.invoke.MethodHandleNatives.linkCallSite(java.base@24.0.2/MethodHandleNatives.java:240)
	at org.apache.tomcat.util.net.NioEndpoint.startInternal(NioEndpoint.java:303)
	at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1485)
	at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:644)
	at org.apache.catalina.connector.Connector.startInternal(Connector.java:1103)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)

AOT缓存创建时的警告信息

另外,我在生成AOT缓存的过程中,看到了几个警告,目前还没确定它们和挂死是否相关,但也列出来供大家参考:

187 [5.271s] [warning] [cds] Preload Warning: Verification failed for org.springframework.transaction.reactive.TransactionalOperator
188 [6.378s] [warning] [cds] Preload Warning: Verification failed for org.springframework.web.servlet.view.freemarker.FreeMarkerView
189 [6.426s] [warning] [cds] Skipping jdk/internal/event/Event: JFR event class
190 [6.428s] [warning] [cds] Skipping io/github/resilience4j/spring6/circuitbreaker/configure/RxJava3CircuitBreakerAspectExt: Failed verification

想请教大家的几个问题

  • 有没有同学遇到过Spring Boot 3.5.4 + JDK 24 AOT缓存的类似挂死问题?有没有已知的解决方案?
  • 针对这种卡在MethodHandle相关调用的情况,有什么调试技巧能帮我深入排查卡壳的原因?比如有没有JVM参数或者工具能追踪MethodHandle的链接过程?
  • 生成AOT缓存时的这些类验证失败警告,会不会是导致挂死的原因?如果是的话,该怎么处理这些验证失败的类?

非常感谢大家的帮助!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:04:33