zoukankan      html  css  js  c++  java
  • 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部署时无法设置,那么最后可以考虑方案一。

    参考文献

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

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


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

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


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

  • 相关阅读:
    ionic的start-y属性初始化页面
    AngularJS时间轴指令
    [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys
    常用CSS样式
    angularjs ng-click
    不是SELECTed表达式
    跨域资源共享(CORS)问题解决方案
    AngularJS身份验证:Cookies VS Tokens
    Javascript跨域
    Vmware虚拟机centos7命令登录模式与成桌面模式切换
  • 原文地址:https://www.cnblogs.com/zyfd/p/9790493.html
Copyright © 2011-2022 走看看