java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java.lang.StackOverflowError出现原因

java.lang.StackOverflowError出现的原因及解决

作者:psh1234

这篇文章主要介绍了java.lang.StackOverflowError出现的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java.lang.StackOverflowError出现的原因

严重: Exception initializing page context
java.lang.StackOverflowError
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:545)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)

StackOverflow  这个问题一般是程序里可能是有死循环或递归调用所产生的;可以查看一下程序,也可以增大JVM的内存

在Eclipse中JDK的配置中加上 -XX:MaxDirectMemorySize=128  就行了,默认是64M,增大一倍,还不行的话,就用256吧,

还不行的话,估计就是程序里头有死循环,或递归调用没写好了。

深入理解java.lang.StackOverflowError

StackOverflowError:栈溢出错误,如果一个线程所需用到栈的大小>配置允许最大的栈大小,那么jvm就会抛出StackOverflow。

栈的特点

1、栈,也叫栈内存,是jvm的内存模型之一,每当启动一个新线程的时候,jvm都会为它分配一个java栈。jvm只会直接对java栈执行两种操作,以帧为单位的压栈和出栈。

2、栈存储的内容:方法内的局部变量表、操作数、动态链接、方法出口信息、其他等信息。

3、栈的生命周期:随着线程的创建而创建,线程的结束而消亡,释放内存,所以栈内存是私有的。

4、栈的存储方式:栈内存以栈帧(Stack Frame)为单位存储,栈帧是一个内存区块,是一个有关方法和运行期数据的数据集。当一个方法M1被调用的时候,就会产生一个栈帧S1,并被压入到栈中,M1方法又调用了M2方法,这个时候又产生栈帧S2也被压入栈,M2方法执行完毕后,S2栈帧先出栈,S1栈帧再出栈,遵循“先进后出”原则。

出现StackOverflowError的原因分析

一般出现这个问题是因为程序里有死循环或递归调用所产生的。

如:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //死循环
        int i=0;
        while (true){
            i++;
            Log.i("ruxing","i="+i);
        }
    }
    //递归
    private void add(int i){
        i++;
        Log.i("ruxing","i="+i);
        add(i);
    }
}

以递归为例,详解程序:

1)启动MainActivity,会创建一个线程,同时创建一个栈内存。

2)调用add()方法的时候,会对add()方法进行压栈操作,将add()运行期数据的数据集保存到栈帧中。

3)add()递归调用时,都会产生一个新的栈帧区块,这是就会连续的产生新的栈帧区块。

4)当栈内存超过系统配置的栈内存,就会出现java.lang.StackOverflowError异常。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文