本文来自网易云社区

作者:王飞

错误日志

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

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存储和查询的分片问题

Java web 服务启动时Xss溢出异常处理笔记的更多相关文章

  1. java web项目启动时自动加载自定义properties文件

    首先创建一个类 public class ContextInitListener implements ServletContextListener 使得该类成为一个监听器.用于监听整个容器生命周期的 ...

  2. java web项目启动时浏览器路径不用输入项目名称方法

    http://blog.csdn.net/qq542045215/article/details/44923851

  3. Web应用启动时,后台自动启动一个线程(转)

    原文:http://blog.sina.com.cn/s/blog_6810dfc20101ipzq.html Web应用启动时,后台自动启动一个线程 (1)前言 前几天,manager问道一个问题: ...

  4. JavaWeb 服务启动时,在后台启动加载一个线程

    JavaWeb 服务启动时,在后台启动加载一个线程. 目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet. 下面对这两种方法做一简单的介绍, ...

  5. "轻"量级 Java Web 服务框架漫谈

    博文太长了, 还是先说下概要: 框架"轻量"与否可以从两方面来看待: 1) 框架本身的体量 - 例如小 jar 无依赖的苗条框架; 2) 用户使用框架是否获得各种便利而无阻隔(&q ...

  6. 转载:如何让spring mvc web应用启动时就执行

    转载:如何让spring mvc web应用启动时就执行特定处理 http://www.cnblogs.com/yjmyzz/p/4747251.html# Spring-MVC的应用中 一.Appl ...

  7. web服务启动spring自己主动运行ApplicationListener的使用方法

    我们知道.一般来说一个项目启动时须要载入或者运行一些特殊的任务来初始化系统.通常的做法就是用servlet去初始化.可是servlet在使用spring bean时不能直接注入,还须要在web.xml ...

  8. Java Web使用过滤器防止Xss攻击,解决Xss漏洞

    转: Java Web使用过滤器防止Xss攻击,解决Xss漏洞 2018年11月11日 10:41:27 我欲乘风,直上九天 阅读数:2687   版权声明:本文为博主原创文章,转载请注明出处!有时候 ...

  9. Java Web项目启动执行顺序

    一. 1.启动一个WEB项目,WEB容器会先去读取它的配置文件web.xml,读取<context-param>和<listener>两个节点. 2.接着,容器创建一个Serv ...

随机推荐

  1. 生产环境中mysql+keepalive双主模式,keepalive守护进程实现双主切换提供数据库服务

    mysql+keepalive实现浮动地址自动切换,由于keepalive无自带健康检查功能,所以必须自动编写健康检查守护进程(监控DB1和DB2数据库的监控状态,来保证浮动地址双机自动切换.) 一, ...

  2. jQuery选择器之样式

    .attr()与.removeAttr() 每个元素都有一个或者多个特性,这些特性的用途就是给出相应元素或者其内容的附加信息.如:在img元素中,src就是元素的特性,用来标记图片的地址. 操作特性的 ...

  3. Windows 10下mysql 64位 安装(mysql-5.7.11-winx64安装)

    Windows下mysql 64位 安装(mysql-5.7.11-winx64安装) 系统Windows10 安装包mysql-5.7.11-winx64.zip 安装过程中遇到的问题,请留意4.0 ...

  4. H5移动端图片裁剪(base64)

    在移动端开发的过程中,或许会遇到对图片裁剪的问题.当然遇到问题问题,不管你想什么方法都是要进行解决的,哪怕是丑点,难看点,都得去解决掉. 图片裁剪的jquery插件有很多,我也测试过很多,不过大多数都 ...

  5. sql中的exsits和not exsits

    select * from table where exsits(sql语句) :  括号中sql语句有数据则返回这些相关id的数据集 select * from table where not ex ...

  6. APP弱网测试点

  7. 目后佐道IT教育的品牌故事

    关于目后佐道 目后佐道IT教育作为中国IT职业教育领导品牌,致力于HTML5.UI.PHP.Java+大数据.Python+人工智能.Linux.产品经理.测试.运维等课程培训.100%全程面授,平均 ...

  8. JAVASCRIPT闭包以及原型链

    方法内部还有个方法,实例化父方法后,再次调用父方法,可以运行父方法内部的子方法,这样的程序就叫做闭包 DEMO如下: //function outerFn() { // var outerVar = ...

  9. CPP-基础:字节对齐

    一.   什么是字节对齐,为什么要对齐?      现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的 ...

  10. end和sep的使用方法

    end: 默认是换行'\n',表示以什么结尾,比如以, | \n 等 方法: 默认end = '\n' a b c 如果end = ' ' a b c sep: 默认是空格' ' 表示两个字符之间用什 ...