问题描述:
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 排除 即可解决
常见的代码优化(通用场景)
- 避免无限递归:确保递归函数有终止条件。
- 减少局部变量:优化方法内临时对象数量。
- 替换递归为迭代:例如用循环代替递归算法。