`
baqicym
  • 浏览: 769 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转载】Tomcat 7.0.5x 启动慢并且遇到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)
……

解决办法:

使用tomcat 7.0.5x版本的同学可以发现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.5X版本支持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://qingyuexiao.iteye.com/blog/1886059
分享到:
评论

相关推荐

    tomcat7.0.5

    Apache Tomcat 7.0.5 是一个广泛使用的开源软件,用以部署和运行Java Servlets和JavaServer Pages(JSP)的应用服务器。这个版本是Tomcat 7系列的一个特定更新,提供了对Java EE 6 Web Profile的支持。下面将详细...

    tomcat-7.0.5安装版

    Tomcat 7.0.5 是一款广泛应用的开源Java Servlet容器,由Apache软件基金会开发,主要用于部署和运行Java Web应用程序。这个"tomcat-7.0.5安装版"是针对Windows操作系统的版本,用户可以通过双击安装程序来便捷地在...

    apache-tomcat-7.0.5

    apache-tomcat-7.0.5

    Tomcat7.0.5,Tomcat最新版本下载

    Apache Tomcat 7.0.5 是一个广泛使用的开源软件,用作Java Servlet和JavaServer Pages(JSP)的Web应用程序服务器。它是由Apache Software Foundation开发的,是ApacheJakarta项目的一部分,专为处理Java EE的轻量级...

    apache-tomcat-7.0.5\apache-tomcat-7.0.5.exe

    jsp servlet 开发必备!属于。exe,直接拿来就能用,不用去官网下载那些包了。简单实用型!

    tomcat-7.0.5

    Tomcat 7.0.5 是一个非常重要的版本,它是Apache软件基金会的开源Java Servlet容器,主要用于部署和运行Java Web应用程序。这个版本以其稳定性而受到赞誉,是许多开发者和企业的首选。下面将详细介绍Tomcat 7.0.5...

    apache-tomcat-7.0.5免安装版

    Apache Tomcat 7.0.5 是一个广泛使用的开源软件,它是Java Servlet、JavaServer Pages (JSP) 和Java EE的Web应用服务器实现。这款免安装版本提供了方便的下载和部署方式,使得开发者无需经过复杂的安装过程即可在...

    tomcat7.0.5+nginx负载均衡配置

    在IT行业中,构建高效、可扩展的Web服务是至关重要的,而`tomcat7.0.5`与`nginx`的结合使用正是实现这一目标的一种常见策略。`Tomcat`是一款开源的Java应用服务器,主要用于运行Java Servlet和JavaServer Pages(JSP...

    apache-tomcat-7.0.5 安装版

    Apache Tomcat 7.0.5 是一个广泛使用的开源软件,用作Java Servlet和JavaServer Pages(JSP)的Web应用程序服务器。它是由Apache Software Foundation维护的Tomcat项目的一部分,专注于提供一个轻量级、高性能的Java...

    apache-tomcat-7.0.5-src

    【Apache Tomcat 7.0.5 源码解析】 Apache Tomcat 是一个开源的、免费的应用服务器,专门用于部署Java Servlet和JavaServer Pages(JSP)的应用程序。它是Apache软件基金会的一部分,并且遵循Apache License 2.0...

    apache-tomcat-7.0.52 解压免安装版tomcat7

    Apache Tomcat 7.0.52 是一个广泛使用的开源软件,它是一个实现了Java Servlet、JavaServer Pages(JSP)和Java EE的Web应用程序容器。这个版本是免安装的,这意味着用户无需经过复杂的安装过程,只需解压到指定目录...

    apache-tomcat-7.0.59.zip

    Apache Tomcat是一款开源的Java Servlet容器,主要用于部署和运行Java Web应用程序。Tomcat 7.0.59是该软件的一个稳定版本,提供了对Java EE 6规范的支持。在这个版本中,用户可以期待一系列增强的功能、性能优化...

    Redis-7.0.5-x64 for Windows 64位版 Redis 7.0.5

    3. **sentinel.conf**: Redis Sentinel是Redis的高可用性解决方案,它监控主从复制集群,当检测到主节点故障时,自动进行故障转移。sentinel.conf文件用于配置Sentinel节点,包括主从节点信息、故障检测阈值和故障...

    redis-7.0.5 win10 x64

    综上所述,Redis-7.0.5在Windows 10 x64环境下提供了便捷的部署和使用体验,具备丰富的数据结构和强大的功能,适合开发人员快速构建高效的数据存储解决方案。通过学习和掌握Redis的基本操作和高级特性,能够更好地...

    apache-tomcat-7.0.55.rar

    Apache Tomcat是一款开源的Java Servlet容器,主要用于部署和运行Java Web应用程序。这个“apache-tomcat-7.0.55.rar”压缩包文件包含了Tomcat服务器的第七个主要版本中的第五十五次小版本更新。在Java Web开发领域...

    tomcat 免安装版 7.0.53和8.5.5版本 win10 不闪退

    Tomcat是一款广泛使用的开源Web服务器和Java应用服务器,由Apache软件基金会开发并维护。免安装版的Tomcat意味着它不需要通过传统安装程序进行安装,而是可以直接解压到指定目录并运行,这为开发者提供了便捷性。在...

    apache-tomcat-7.0.50.zip

    Tomcat的旧版本,7的版本。之前在Tomcat官网上只能找到比较新的版本,需要7版本...Apache Tomcat 7版本是目前的开发焦点,它在汲取了Tomcat 6.0.x优点的基础上,实现了对于Servlet 3.0、JSP 2.2和EL 2.2等特性的支持。

    Redis-x64-7.0.5-windows11

    2. **下载源码**:从Redis官网获取最新版本的源代码,或者直接使用提供的Redis-x64-7.0.5编译好的二进制文件。 3. **配置环境变量**:将Redis的bin目录添加到系统PATH环境变量中,以便于命令行启动Redis服务。 4. **...

    tomcat7.050-64位

    【标题】"Tomcat7.050-64位" 涉及的主要知识点是Apache Tomcat服务器的特定版本,这是一个广泛使用的开源Java Servlet容器,特别针对Java Web应用程序进行部署和管理。Tomcat 7.0.50是这个系列的一个64位构建,这...

Global site tag (gtag.js) - Google Analytics