解決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會出現再啟動還原的情況,所以如果啟動再遇此異常,再次更改這里即可。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM