`

【转载】Tomcat 7.0.3x 启动慢并且遇到StackOverflowError的异常的解决办法

阅读更多
之前使用tomcat7时遇到启动报错问题,日志如下:

严重: ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mypro]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1114)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1673)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/mypro]. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2109)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1981)
at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1947)
at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1932)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1326)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5179)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 11 more
Caused by: java.lang.StackOverflowError
at java.util.HashMap.get(HashMap.java:300)
at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2257)
at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
at org.apache.catalina.startup.ContextConfig.populateSCIsForCacheEntry(ContextConfig.java:2269)
……


在网上找了很久,最终解决问题,在这时MARK一下。以下是解决方法:

--------------------------------------------------以下文章为转载--------------------------------------------------

使用tomcat 7.0.3x版本的同学可以发现tomcat启动慢了不少,而且还可能遇到如下启动时异常:

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.

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包

网上大多数的答案的都是说在web.xml中加入了metadata-complete="true"就能避免这个异常。确实在很多场景下,这个异常是能够避免。但是使用spring-web-3.1.0.RELEASE的同学就杯具了,这个jar包中定义了一个ServletContainerInitializer,还是导致了扫描jar包。

我们可以用另外的办法来解决这个问题,我们让tomcat不扫描指定的jar包,tomcat就要轻松得多了,org.apache.tomcat.util.scan.StandardJarScanner中定义了defaultJarsToSkip,有了这个东东,我们就可以跳过某些jar包。

如果你不想使用servlet3.0 annotation支持,在tomcat的catalina.properties配置文件中tomcat.util.scan.DefaultJarScanner.jarsToSkip的值后面加一个",*",这样就不会扫描所有的jar包了。启动更快,也不会出异常。


tomcat在处理扫描是还有个小bug,比如我遇到了

SEVERE: Unable to process Jar entry [__MACOSX/cn/****/._HandlerFactory.class] from...

这是tomcat在扫描到以.class为后缀的文件后,就分析类,很明显,此文件都不是java类文件。tomcat不应该只判断后缀为.class就是java类文件。



原文地址:http://qiuboboy.iteye.com/blog/1853216
分享到:
评论
5 楼 qingyuexiao 2018-01-22  
sdtzyb 写道
引发新的问题:
org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application

这是另一个问题,可参见《mcat7下运行JSP找不到JSTL路径问题(无法解析EL)》http://qingyuexiao.iteye.com/blog/1949440
4 楼 sdtzyb 2017-09-26  
引发新的问题:
org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
3 楼 zy_cwh 2016-12-09  
秒杀其他方案,非常感谢!!
2 楼 yangfande362 2016-03-29  
不错,加tomcat内存也不管用,还是加在tomcat的catalina.properties配置文件中tomcat.util.scan.DefaultJarScanner.jarsToSkip的值后面加一个",*"管用!
1 楼 RonQi 2015-11-20  
  谢谢,解决我的问题了

相关推荐

    tomcat7.0.3免安装版

    【标题】:“Tomcat7.0.3免安装版”是指一种无需进行复杂安装过程的Apache Tomcat服务器版本。这个版本适用于快速部署和测试环境,它包含必要的组件,可以直接运行,便于开发者或系统管理员快速启动和停止Tomcat服务...

    tcnatlve-1(tomcat7.0.3)

    适用于tomcat7.0.3的APR库,Tomcat7.0免安装版是不带有APR库的,只要将tcnative-1.dll放入tomcat7.0\bin下就可以发布并运行程序了,我还附上了tomcat7.0.3

    Nessus-7.0.3-x64

    Nessus-7.0.3-x64Nessus-7.0.3-x64Nessus-7.0.3-x64Nessus-7.0.3-x64

    SecureCRT 7.0.3 x64

    SecureCRT 7.03官方64位版 发布于2013年1月17日。 注册方法自6.7.5版本后是一样的。 Standard 64-bit (x64) Windows PC Installer SecureCRT 7.0.3 (non-integrated) scrt703-x64.exe

    SecureCRT and SecureFX v7.0.3 x86 x64完全注册正式破解版

    SecureCRT and SecureFX v7.0.3 x86 x64完全注册正式破解版

    ESXi7.0.3安装教程

    "ESXi 7.0.3 安装教程" 本文将详细介绍 ESXi 7.0.3 的安装过程,并对安装步骤进行详细解释。 VMware ESXi 概述 VMware ESXi 是 VMware 公司推出的虚拟机监控程序,能够将物理服务器虚拟化为多个虚拟机,实现...

    SecureCrt7.0.3 x64破解

    文件列表:SecureCrt7.0.3_x64、SecureCrt7.0.3_x86、keygen、readme.txt 1. Main Program Installation install the binary program "scrt703-x64.exe" 2. Hack it kick the binary program "keygen.exe" Patch it ...

    SecureCRT & SecureFX 7.0.3 x64

    SecureCRT and SecureFX 7.0.3 (integrated) * scrt_sfx703-x64.exe * The integrated installer is required for settings to be shared between SecureCRT and SecureFX. The non-integrated installer does not ...

    Redis 7.0.3 for Windows

    总之,Redis 7.0.3 for Windows为Windows用户提供了一个强大的、安全的和高性能的数据存储解决方案。对于依赖Redis的业务,升级到7.0.3不仅可以利用新的特性,还能确保系统的安全性和稳定性,值得立即行动。

    ImageMagick-7.0.3-6-Q16-x64-static

    ImageMagick-7.0.3-6-Q16-x64-static

    cudnn-9.0-linux-x64-v7.0.3

    在本压缩包“cudnn-9.0-linux-x64-v7.0.3”中,包含的是针对CUDA 9.0版本的CUDNN 7.0.3,这是一个适用于Linux操作系统的64位版本。 CUDNN的主要功能是优化深度学习模型的训练和推理过程,它提供了高效的卷积、池化...

    PLSQL Developer 7.0.3 Setup.exe

    PLSQL Developer 7.0.3 Setup.exe PLSQL Developer 7.0.3 Setup.exe PLSQL Developer 7.0.3 Setup.exe

    ios7.0.3的shsh文件 刷机用

    ios7.0.3shshios7.0.3的shsh文件 刷机用

    PowerBuilder 7.0.3补丁

    Release Notes for PowerBuilder[R] Version 7.0.3 (c) 1991-2000 Sybase, Inc. and its subsidiaries. All rights reserved. Updated 12/06/00 _________________________________________________________________...

    itext7-7.0.3.zip

    iText 7.0.3 是一个流行的Java库,用于创建和编辑PDF文档。这个压缩包包含了一系列与iText相关的组件和验证文件,主要用于确保软件的完整性和安全性。以下是每个文件的基本介绍及其关联的知识点: 1. **forms-7.0.3...

    PowerShell-7.0.3-win-x64.zip

    7.0.3-win-x64.zip是PowerShell的一个特定版本,专为64位Windows系统设计,旨在提供更高效、用户友好的操作体验。 安装PowerShell 7.0.3后,用户可以通过命令行界面执行各种系统管理和任务自动化操作,如文件管理、...

    安卓微信7.0.3版本.zip

    《安卓微信7.0.3版本:新功能与优化解析》 微信,作为全球最大的即时通讯平台之一,其每一次更新都备受关注。这次我们聚焦的是微信的安卓7.0.3版本,这是腾讯官方推出的新一轮升级,旨在提供更加优质且稳定的用户...

    Highcharts-7.0.3.zip

    在"Highcharts-7.0.3.zip"这个压缩包中,包含了该库的7.0.3版本,这是一次更新,可能包含了性能优化、新功能或者对现有功能的改进。下面将详细介绍Highcharts及其相关知识点。 1. **兼容性**:Highcharts 兼容广泛...

    update-cm-7.0.3-N1-signed

    【标签】"update -cm -7.0.3-N1 -signed" 代表了这个更新包的关键特征:它是CyanogenMod的更新,版本号7.0.3,面向设备型号N1,并且已经过签名验证。签名验证是Android系统安全的一部分,确保更新来自可信的源,未被...

    redis-windows-7.0.3.rar

    此压缩包"redis-windows-7.0.3.rar"提供的是Redis针对Windows操作系统的最新版本7.0.3。在Windows环境下,Redis的部署和使用与Linux有所不同,但其核心功能保持一致。 1. **Redis的安装与配置**: 解压此rar文件后...

Global site tag (gtag.js) - Google Analytics