当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

转载:http://qingyuexiao.iteye.com/blog/1886059


之前使用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类文件。


转载于:https://my.oschina.net/liuxinzhou/blog/599269

相关文章:

  • ubuntu14.04 使用kvm安装win7系统
  • A successful Git branching model
  • ELK日志系统:Elasticsearch + Logstash + Kibana 搭建教程
  • centos制作yum源
  • android在假设绘制自己定义的bitmap,然后返回给ImageView
  • 通过读取excel文件生成sql语句
  • 指针知识梳理5-字符串与指针,程序内存总结
  • 使用360浏览器访问字体逆时针旋转90度的问题
  • Shell脚本实现自动修改IP地址
  • 参数的排列组合
  • 在当今快节奏的软件更迭当中,我们是否还需要进行系统的学习?
  • JSTL截取字符串
  • Java开发相关配置
  • Java BIO、NIO、AIO-------转载
  • JSPatch
  • (三)从jvm层面了解线程的启动和停止
  • 【node学习】协程
  • 10个最佳ES6特性 ES7与ES8的特性
  • 2017 年终总结 —— 在路上
  • conda常用的命令
  • Create React App 使用
  • HTTP中的ETag在移动客户端的应用
  • js算法-归并排序(merge_sort)
  • LeetCode18.四数之和 JavaScript
  • Mysql优化
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • SQLServer之创建数据库快照
  • Vue.js-Day01
  • 构建工具 - 收藏集 - 掘金
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前端技术周刊 2019-02-11 Serverless
  • 数据仓库的几种建模方法
  • 正则学习笔记
  • 中文输入法与React文本输入框的问题与解决方案
  • #13 yum、编译安装与sed命令的使用
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $$$$GB2312-80区位编码表$$$$
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (libusb) usb口自动刷新
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (多级缓存)多级缓存
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (九十四)函数和二维数组
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ***测试-HTTP方法
  • .axf 转化 .bin文件 的方法
  • .NET delegate 委托 、 Event 事件
  • .NET gRPC 和RESTful简单对比
  • .Net Remoting常用部署结构
  • .NET 的程序集加载上下文
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net的socket示例