Java web 服务启动时Xss溢出异常处理笔记
本文来自网易云社区
作者:王飞
错误日志
错误日志要仔细看,第一行不一定就是关键点,这个错误出现的时候,比较靠后,其中关键行就是下面这句。
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.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]
问题找到了,那如何解决呢?
网上给出了一些解决办法,大致可以分为以下几种,我也尝试了一下。
方法一 调整Xss参数
Xss是什么呢?它是用来设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
把这参数设置的更大,如-Xss10M,问题解决。
NDP部署系统中,设置jvm的参数位置在“发布配置”->“jvmExtra”字段中,填上重新发布即可生效。
当前这里我没有去尝试设置到最小是多大可以解决问题,因为这种解决方式虽然你能用,但并不合理。因为这样设置以后,服务中每启动一个线程,就会占用所设置的大小,在内存充裕的情况可以偷懒着,这么做。另外一个原因是这个问题出现在我的一个组件包内,这么做的话,会让后期其它组件包启动的服务都需要去手动设置这个值,于是我们尝试去看看jar包有没有问题?
方法二 检查jar包是否有问题
看到有人说升级jar至最新版本可以解决问题,不过很可惜,我引用的进来的jar已经是最新版本,无法升级。
但我再查看jar的时候发现,项目中引用了两个版本的jar包文件呢,于是猜测可能是jar包冲突导致的。尝试maven打包中排除加载旧版本的jar,保留一个jar包版本。
重启成功。
排除某一个jar中引用的某个jar文件方法如下:
<dependency> <groupId>com.xxx.xxx</groupId> <artifactId>commons-utils</artifactId> <version>0.17.5</version> <exclusions> <exclusion> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> </exclusion> </exclusions></dependency>
方法三 跳过tomcat启动检查
因为tomcat启动会去扫描jar包,看错误信息org.bouncycastle.asn1.ASN1EncodableVector,是出在这个类
这个类出现在bcprov*.jar这个包
所以在tomcat的conf目录里面catalina.properties的文件,
在tomcat.util.scan.DefaultJarScanner.jarsToSkip=里面加上bcprov*.jar过滤
启动不会报错了,这个方法没有尝试,因为NDP部署是不支持配置该功能的,不适合我的业务场景。
小结
Xss溢出的原因,多半是jar问题,所以尽可能的查找jar是否出错,而不是去通过设置Xss的大小或者去tomcat的设置跳过检查,都不是真正的通过问题根本原因去解决bug。
当然通过方案二无法确认jar包问题的话,可能首选的还是方案三,不过方案三在NDP部署时无法设置,那么最后可以考虑方案一。
参考文献
网易云免费体验馆,0成本体验20+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区。
相关文章:
【推荐】 django项目在uwsgi+nginx上部署遇到的坑
【推荐】 Kylin存储和查询的分片问题