云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

生产实战:循环继承依赖 导致web 项目启动失败,总是超时

jxf315 2025-05-27 15:21:56 教程文章 5 ℃

问题描述:

Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1OutputStream->org.bouncycastle.asn1.DEROutputStream->org.bouncycastle.asn1.DLOutputStream->org.bouncycastle.asn1.ASN1OutputStream]


根本原因是 循环依赖

此错误常见于 Tomcat 7.0.3x+ 启动时,
尤其是启用 Servlet 3.0 特性后,
容器会扫描所有 JAR 包中的类注解(如 @WebServlet)。

当扫描到存在 循环继承依赖 的类时,
递归加载超出 JVM 线程栈容量(默认 -Xss=1MB),
导致栈溢出。

核心原因分析

1.循环继承依赖(代码逻辑缺陷)

  • 现象:两个类(如 ASN1EncodableVector 和 DEREncodableVector)互相继承,形成无限递归的类加载循环。
  • 根源:项目中引入了多个版本的 Bouncy Castle 或其他第三方库,导致同名类存在冲突继承关系。

2.线程栈空间不足(JVM 参数问题) 这个可能性很低

  • 默认限制:JVM 线程栈大小通过 -Xss 参数控制,默认值通常为 1MB。当递归层级超过栈容量时触发错误。
  • Tomcat 特殊性:Servlet 3.0 的注解扫描机制会深度遍历类层次结构,加剧栈消耗


解决方案 :消除循环依赖

排查冲突 JAR 包 org.bouncycastle 将冲突的jar 排除 即可解决



常见的代码优化(通用场景)

  • 避免无限递归:确保递归函数有终止条件。
  • 减少局部变量:优化方法内临时对象数量。
  • 替换递归为迭代:例如用循环代替递归算法。

最近发表
标签列表