升级Spring Boot至3.4.0后process-aot触发StackOverflow,原生测试失败
Spring Boot 3.4.0正式版升级后Native测试process-aot栈溢出问题分析
问题描述
将Spring Boot从3.4.0-M2版本升级至3.4.0正式版后,原生(Native)测试执行失败,排查发现process-aot阶段触发StackOverflowError异常,需判断是配置调整问题还是版本回归(Regression)缺陷。
异常栈信息
Exception in thread "main" java.lang.StackOverflowError at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.checkReceiver(DirectMethodHandleAccessor.java:196) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:99) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:281) at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:265) at org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider.getType(SerializableTypeWrapper.java:357) at org.springframework.core.SerializableTypeWrapper.forTypeProvider(SerializableTypeWrapper.java:106) at org.springframework.core.SerializableTypeWrapper$TypeProxyInvocationHandler.invoke(SerializableTypeWrapper.java:215) at org.springframework.core.$Proxy6.getActualTypeArguments(Unknown Source) at org.springframework.core.ResolvableType.getGenerics(ResolvableType.java:809) at org.springframework.core.ResolvableType.getGeneric(ResolvableType.java:762) at org.springframework.validation.beanvalidation.BeanValidationBeanRegistrationAotProcessor$BeanValidationDelegate.lambda$processAheadOfTime$0(BeanValidationBeanRegistrationAotProcessor.java:154) at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:728) at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:707) at org.springframework.validation.beanvalidation.BeanValidationBeanRegistrationAotProcessor$BeanValidationDelegate.processAheadOfTime(BeanValidationBeanRegistrationAotProcessor.java:150) at org.springframework.validation.beanvalidation.BeanValidationBeanRegistrationAotProcessor$BeanValidationDelegate.lambda$processAheadOfTime$0(BeanValidationBeanRegistrationAotProcessor.java:170) at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:728) at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:707)
分析与处理建议
- 大概率属于版本回归问题:从异常调用链可见,问题出在BeanValidation的AOT处理器递归处理字段类型时陷入循环,3.4.0正式版对BeanValidation的AOT逻辑做了调整,可能引入了递归处理的漏洞,导致嵌套/自引用类型触发栈溢出。
- 临时缓解方案:
- 检查项目中是否存在嵌套层级极深的实体类或带自引用的泛型类型,若有可尝试简化类结构,或通过
@AotExclude注解跳过这类类的AOT处理(需确认Spring Boot版本支持该注解)。 - 临时回退到3.4.0-M2版本,验证问题是否消失,以此确认是否为正式版的回归缺陷。
- 调整JVM栈大小:在执行
process-aot任务时添加JVM参数-Xss2m(或更大值,如-Xss4m),临时绕过栈溢出,但这仅为临时 workaround,无法解决根本问题。
- 检查项目中是否存在嵌套层级极深的实体类或带自引用的泛型类型,若有可尝试简化类结构,或通过
- 最终解决方案:
收集触发问题的实体类结构(脱敏后),提交到Spring Boot官方Issue仓库,这类AOT处理的递归栈溢出属于框架逻辑缺陷,需要官方修复。
内容的提问来源于stack exchange,提问作者Eiswind
相关产品推荐
相关产品推荐

