Python 官方文档:入门教程 => 点击学习
目录java.lang.StackOverflowError出现的原因深入理解java.lang.StackOverflowError栈的特点出现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吧,
还不行的话,估计就是程序里头有死循环,或递归调用没写好了。
StackOverflowError:栈溢出错误,如果一个线程所需用到栈的大小>配置允许最大的栈大小,那么jvm就会抛出StackOverflow。
1、栈,也叫栈内存,是jvm的内存模型之一,每当启动一个新线程的时候,jvm都会为它分配一个java栈。jvm只会直接对java栈执行两种操作,以帧为单位的压栈和出栈。
2、栈存储的内容:方法内的局部变量表、操作数、动态链接、方法出口信息、其他等信息。
3、栈的生命周期:随着线程的创建而创建,线程的结束而消亡,释放内存,所以栈内存是私有的。
4、栈的存储方式:栈内存以栈帧(Stack Frame)为单位存储,栈帧是一个内存区块,是一个有关方法和运行期数据的数据集。当一个方法M1被调用的时候,就会产生一个栈帧S1,并被压入到栈中,M1方法又调用了M2方法,这个时候又产生栈帧S2也被压入栈,M2方法执行完毕后,S2栈帧先出栈,S1栈帧再出栈,遵循“先进后出”原则。
一般出现这个问题是因为程序里有死循环或递归调用所产生的。
如:
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异常。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
--结束END--
本文标题: java.lang.StackOverflowError出现的原因及解决
本文链接: https://lsjlt.com/news/153131.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0