Java web 服务启动时Xss溢出异常处理笔记

时间:2022-11-04 06:26:16

本文来自网易云社区

作者:王飞

错误日志

错误日志要仔细看,第一行不一定就是关键点,这个错误出现的时候,比较靠后,其中关键行就是下面这句。

Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [] due to a *Error. 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部署时无法设置,那么最后可以考虑方案一。

参考文献

  1. tomcat启动报错too low setting for -Xss *

  2. tomcat启动报错too low setting for -Xss

网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区

相关文章:
【推荐】 django项目在uwsgi+nginx上部署遇到的坑
【推荐】 Kylin存储和查询的分片问题