求助关于java lang包.lang.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类文件。
原文地址:
浏览 19844
qingyuexiao
浏览: 83216 次
来自: 上海
引发新的问题:org.apache.jasper.Jasper ...
秒杀其他方案,非常感谢!!
支持,问题解决了。使用了DIV+iframe,结果ie7 ie ...
不错,加tomcat内存也不管用,还是加在tomcat的ca ...
谢谢,解决我的问题了
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'2011年9月 Java大版内专家分月排行榜第三
2011年9月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。15:07 提问
java.lang.StackOverflowError的问题
很简单的一段代码,也知道是哪里错误,就是不明白为什么,希望大侠们指教指教
当调用main.drop(6000) 就报错了, drop(int times)方法里调用了自身的方法,这样为什么会导致报错呢
```public class Main {
private double TotalHeight = 100;
private double CurHeight = 50;
public void drop(int times) {
if ((times - 1) == 0) {
setTotalHeight(getTotalHeight() + 2 * getCurHeight());
setCurHeight(getCurHeight() / 2);
drop(times - 1);
public double getTotalHeight() {
return TotalH
public void setTotalHeight(double totalHeight) {
TotalHeight = totalH
public double getCurHeight() {
return CurH
public void setCurHeight(double curHeight) {
CurHeight = curH
public static void main(String[] args) {
Date startDate = new Date();
Main main = new Main();
main.drop(50000); // 此处达到6000的时候就报标题上面的错误
System.out.println("Total height is " + main.getTotalHeight());
System.out.println("Current height is " + main.getCurHeight());
按赞数排序
递归太深了,stack分配给递归的空间是有限的,如果你的递归太深,stack耗尽,就会报堆栈溢出
你是想写个小球弹跳的递归?
我刚写了一个,同样是实现你这个的功能
* @param count 弹跳次数
* @return 返回第count次弹起的高度/
public static double high(int count){
if(count==1){return 50;}
return high(count-1)/2;
* @param count 弹跳次数
* @return 第count次弹跳结束时经过的路程
public static double totalHigh(int count){
if(count==1){return 100+high(count)*2;}//第一次弹跳结束时经过的路程
return totalHigh(count-1)+high(count-1);
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入弹跳次数:");
int count = sc.nextInt();
System.out.println("第"+count+"次弹跳高度为:"+high(count)+"米");
System.out.println("第"+count+"次弹完总路程为:"+totalHigh(count)+"米");
其他相关推荐博客分类:
Java中的每给类从根本上都是继承自Object,标准容器类自然也不例外.因此容器类都有toString()方法.并且重写了该方法,使得它生成的String结果能够表达容器本身,以及容器所包含的对象.例如ArrayList.toString(),它会遍历ArrayList中包含的所有对象,调用没个元素的toString()方法.
===========================以上摘自(JAVA编程思想第四版13.3)=======================
import java.util.ArrayLimport java.util.L
public class InfiniteRecursion {
public InfiniteRecursion(){
InfiniteRecursion object = new InfiniteRecursion(); }
// 情形2: /*
public String toString(){
return " InfinteRecursion address: " + this + "\n"; } */ public static void main(String[] args) {
List&InfiniteRecursion& v = new ArrayList&InfiniteRecursion&();
for (int i = 0; i & 10; i ++){
v.add(new InfiniteRecursion());
System.out.println(v); }}
类似情形1和2都是递归造成了 java.lang.StackOverflowError 异常.
比如情形2: 这里发生了自动类型转换,由InfinteRecursion 类型转换成String类型.因为编译器看到一个String对象后面跟着一个"+",再后面的对象不是String,于是编译器试着将this转换成为一个String.它怎么转换呢,正是通过调用this上的toString()方法.于是就发生了递归调用. 如果你真的想要打印出对象的内存地址.应该调用Object.toString()方法,这才是负责次任务的方法.所以,你不应该使用this.而是应该调用super.toString()方法.
浏览: 69857 次
来自: 北京
很不错的资源
能提供详细的解决办法吗?我正好遇到了这个问题,不想换解析器了, ...
怎么读取合并单元格中的内容呢?
狠不错,给我一些启发了
thank you very much!
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 java.lang.long 的文章

 

随机推荐