解决Tomcat 7遇到StackOverflowError的异常
参考网址:http://qingyuexiao.iteye.com/blog/1886059
前言:在写此博客前,首先感谢姚双琪、林瑞丰、网友qingyuexiao的倾囊相助!此博文不过是笔者对于他们给出的方法经过实践成功而做出的归纳。
一、异常描述
使用Tomcat7启动一个项目报错,日志如下:
一月 01, 2016 11:38:08 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin
警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:mynewdpi' did not find a matching property.
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Server version: Apache Tomcat/7.0.59
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Server built: Jan 28 2015 15:51:10 UTC
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Server number: 7.0.59.0
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: OS Name: Windows XP
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: OS Version: 5.1
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Architecture: x86
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Java Home: C:\Program Files\Java\jdk1.7.0_55\jre
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: JVM Version: 1.7.0_55-b13
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: JVM Vendor: Oracle Corporation
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: CATALINA_BASE: E:\Spring2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: CATALINA_HOME: E:\Tomcat7\apache-tomcat-7.0.59
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Dcatalina.base=E:\Spring2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Dcatalina.home=E:\Tomcat7\apache-tomcat-7.0.59
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Dwtp.deploy=E:\Spring2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Djava.endorsed.dirs=E:\Tomcat7\apache-tomcat-7.0.59\endorsed
一月 01, 2016 11:38:08 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Dfile.encoding=GBK
一月 01, 2016 11:38:08 上午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jdk1.7.0_55\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jre1.8.0_60/bin/client;C:/Program Files/Java/jre1.8.0_60/bin;C:/Program Files/Java/jre1.8.0_60/lib/i386;C:\Program Files\Common Files\NetSarang;D:\MySQL_SOURE\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\oracle\product\10.1.0\db_1\bin;D:\oracle\product\10.1.0\db_1\jre\1.4.2\bin\client;D:\oracle\product\10.1.0\db_1\jre\1.4.2\bin;C:\Program Files\Java\jdk1.7.0_55\bin;E:/apache-maven-3.3.3\bin;D:\STS;;.
一月 01, 2016 11:38:14 上午 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-bio-8081"]
一月 01, 2016 11:38:14 上午 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["ajp-bio-8009"]
一月 01, 2016 11:38:14 上午 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 9896 ms
一月 01, 2016 11:38:15 上午 org.apache.catalina.core.StandardService startInternal
信息: Starting service Catalina
一月 01, 2016 11:38:15 上午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/7.0.59
一月 01, 2016 11:38:18 上午 org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
信息: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [390] milliseconds.
一月 01, 2016 11:38:18 上午 org.apache.catalina.loader.WebappClassLoader validateJarFile
信息: validateJarFile(E:\Spring2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\mynewdpi\WEB-INF\lib\servlet-api.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/servlet/Servlet.class
一月 01, 2016 11:38:26 上午 org.apache.catalina.core.ContainerBase startInternal
严重: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mynewdpi]]
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:188)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:816)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mynewdpi]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
... 6 more
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/mynewdpi] 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.jce.provider.DSABase->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature->java.security.SignatureSpi->java.security.Signature]
at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2144)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2090)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1965)
at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1931)
at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1916)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1330)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:889)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:386)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5412)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 6 more
一月 01, 2016 11:38:26 上午 org.apache.catalina.core.ContainerBase startInternal
严重: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:188)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:300)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:739)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.startup.Catalina.start(Catalina.java:689)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:321)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:816)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 6 more
一月 01, 2016 11:38:26 上午 org.apache.catalina.startup.Catalina start
严重: The required Server component failed to start so Tomcat is unable to start.
org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.startup.Catalina.start(Catalina.java:689)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:321)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:739)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 7 more
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 9 more
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:300)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 11 more
一月 01, 2016 11:38:26 上午 org.apache.coyote.AbstractProtocol pause
信息: Pausing ProtocolHandler ["http-bio-8081"]
一月 01, 2016 11:38:26 上午 org.apache.coyote.AbstractProtocol pause
信息: Pausing ProtocolHandler ["ajp-bio-8009"]
一月 01, 2016 11:38:26 上午 org.apache.catalina.core.StandardService stopInternal
信息: Stopping service Catalina
一月 01, 2016 11:38:26 上午 org.apache.coyote.AbstractProtocol destroy
信息: Destroying ProtocolHandler ["http-bio-8081"]
一月 01, 2016 11:38:26 上午 org.apache.coyote.AbstractProtocol destroy
信息: Destroying ProtocolHandler ["ajp-bio-8009"]
二、分析及解决
第一次碰到这个异常,开始以为是org.apache.catalina.LifecycleException,但后来才发现这不过是JVM抛出的最大的异常,光知道这个没什么用,最后才准确定位到引起此异常的原因(其实日志信息已经很清楚的给出了):Unable to complete the scan for annotations for web application [/mynewdpi] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies.
在http://qingyuexiao.iteye.com/blog/1886059 文章中讲述了引起此异常的原因:
tomcat7.0.3X版本支持servlet3.0的特性,比如说支持@WebServlet、@WebListener,要支持这些特性,tomcat就得去扫描所有的jar包里面的每个类。这个异常表明在扫描jar包的时候,递归调用太深,导致栈溢出了,tomcat给了一个馊主意,让你增大xss,这个还是不好,xss加大了,可用线程数就少了。
分析tomcat源代码,发现它扫描的流程如下:
1.扫描所有jar包
2.通过查找jar包中META-INF/services/javax.servlet.ServletContainerInitializer文件内的定义,初始化ServletContainerInitializer实现
3.如果web.xml中配置了metadata-complete="true" 或者没有找到ServletContainerInitializer实现,都不会继续扫描jar包
笔者也采用过以增加Xss(线程内存)的方法解决,但最终失败了(虽然不建议这样做)。那么就采用其他的方式进行解决:
一、在web.xml中配置metadata-complete="true" 。需说明的是:web-app的配置应是3.0版本,如果你的是2.5或者其他版本,可直接复制下面的信息。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0" metadata-complete="true"> </web-app>
二、修改tomcat的catalina.properties
如果你不想使用servlet3.0 annotation支持,在tomcat的安装目录的conf目录中找到catalina.properties,在tomcat.util.scan.DefaultJarScanner.jarsToSkip的值后面加一个",*",这样就不会扫描所有的jar包了。启动更快,也不会出异常。
如下图:
三、修复Eclipse的项目发布地址
参见我的另一篇博客:http://www.cnblogs.com/wql025/p/5084653.html
注:以eclipse的run as 启动项目,eclipse一般的默认方式是将项目部署到项目所在工作空间的metadata,而上面的博客讲解了如何将项目部署到Tomcat的webapp目录,这也是解决此异常不可或缺的一步(当然你可以对上面的方法进行分步尝试,先做第一步,不行了再做第二步...)
后记:修改tomcat的catalina.properties这一步至关重要!而且,Tomcat会出现再启动还原的情况,所以如果启动再遇此异常,再次更改这里即可。
解决Tomcat 7遇到StackOverflowError的异常的更多相关文章
- Tomcat启动报StackOverflowError
近期工程部署到Tomcat时,出现以下异常: 16-May-2018 09:35:25.590 严重 [localhost-startStop-1] org.apache.catalina.core. ...
- 启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration.
启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration. 出现此异常是因为,str ...
- 怎么解决tomcat占用8080端口问题
怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现 Several ports (8080, 8009) requir ...
- 解决tomcat部署多个虚拟机时报IllegalStateException: Web app root system property already set to 的问题
解决tomcat部署多个虚拟机时报IllegalStateException: Web app root system property already set to 的问题 在web.xml中添加如 ...
- 怎么解决tomcat占用8080端口问题图文教程(转)
亲测有效. 原因:可能是开了多个tomcat 原文网址:http://jingyan.baidu.com/article/1612d5006c3cdae20e1eee04.html 怎么解决tomc ...
- Android 解决双卡双待手机解析短信异常
开发中,难免会遇到各种各样的适配问题,尤其是经过深度修改定制过的系统,有的无论是软硬件上都有很大的区别,这里不得不提到一种奇葩的机型,没错,那就是双卡双待的手机(比如XT800, A60, S8600 ...
- 解决tomcat占用8080端口
怎么解决tomcat占用8080端口问题图文教程 怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现 Se ...
- 转:解决tomcat服务器跨域问题
原文地址: 解决tomcat服务器跨域请求问题 注:还未测试 在tomcat 的web.xml 配置文件中加入如下配置过滤器 (如web.xml中有多个filter时要把下面配置放在最前端) < ...
- 解决:Tomcat 局域网IP地址 访问不了
解决:Tomcat 局域网IP地址 访问不了 2014年10月17日 ⁄ 综合 ⁄ 共 1000字 ⁄ 字号 小 中 大 ⁄ 评论关闭 如果连最基本的localhost:8080都失败的话. 原因就一 ...
随机推荐
- Firebug 调试技巧之console API
console.log(object[, object, ...]) Writes a message to the console. You may pass as many arguments a ...
- 【学习笔记】【C语言】选择结构-switch
1.用法 switch(整型表达式) { case 数值1: 语句1; break; case 数值2: 语句2; br ...
- Java并发编程概要
线程开的越多,则性能越好吗? 未必,影响多线程性能的因素有:上下文切换,竞争/死锁,资源限制等.对于这些因素要均衡考量,才能获得较好的性能. 并发控制/线程间的通信方式 基本的并发控制原语有 vola ...
- 杭电ACM2092--整数解
杭电ACM2092--整数解 分析 http://acm.hdu.edu.cn/showproblem.php?pid=2092 一个YES,一个Yes.试了10几次..我也是无语了..哪里都不 ...
- C89 和 C99的标准比较
本文转载自: C89和C99标准比较 原文转载自: http://blog.programfan.com/article.asp?id=14051 http://blog.csdn.net/xgb ...
- 《DNS加密更新》RHEL6
DNS加密更新: 继DNS更新之后,现在又玩DNS加密更新,差不多. DNS更新指定一台主机,那台主机或多台主机来更新它,其他主机没权限. DNS加密更新,谁有密码说就可以更新. 做过上次的更新之后, ...
- wordpress忘记密码重置
一直使用浏览器记录密码的方式登陆wordpress,直到有一天重装系统,而浏览器的记录又没有备份,结果怎么也想不起当初所设定的密码了…… -_-||| 遂google了一番,发现了直接修改数据库重设密 ...
- 基于FPGA的图像去噪
目录 结构图 其中FPGA 控制模块为核心,通过它实现视频图像数据的获取.缓存.处理和控制各模块间通讯[1].由CCD 相机对目标成像,高速图像数据由camera link 实时传输[2],经信号转换 ...
- CMD规范的函数与普通函数间调用
/* * a.js * 普通的非cmd规范的js文件 */ function fun1(){ console.log("fun1"); //调用seajs模块中的fun1 seaj ...
- [DevExpress]ChartControl之柱状图示例
关键代码: using System; using System.Data; using System.Windows.Forms; using CSharpUtilHelpV2; using Dev ...