java.lang.StackOverflowError出现的原因及解决
作者:psh1234 发布时间:2022-03-21 08:12:21
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、栈存储的内容:方法内的局部变量表、操作数、动态链接、方法出口信息、其他等信息。
1)局部变量表:保存函数的参数以及局部变量用的,局部变量表中的变量只在当前函数调用中有效,当函数调用结束后,随着函数栈帧的销毁,局部变量表也会随之销毁。
2)操作数:主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。在概念模型中,两个栈帧是相互独立的,但是大多数虚拟机的实现都会进行优化,令两个栈帧出现一部分重叠,令下面部分的操作数栈与上面部分的局部变量表重叠在一块,这样在方法调用的时候可以共用一部分数据,无需进行额外的参数复制传递。
3)动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。在Class文件的常量池中存有大量的 符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。这些符号引用一部分会在类加载阶段或第一次使用的时候转化为直接引用,这种转化 称为静态解析。另外一部分将在每一次的运行期期间转化为直接引用,这部分称为动态连接。
4)方法出口信息:在方法退出之前,都需要返回到方法被调用的位置,程序才能继续执行,方法返回时可能需要在栈帧中保存一些信息,用来恢复它的上层方法的执行状态,方法出口信息获取分为正常退出和异常退出。正常退出通过pc计数器的值获取,异常退出通过异常处理器表确定返回地址。
5)附加信息:虚拟机规范中允许具体的虚拟机实现增加一些规范中没有描述的信息到栈帧中,这部分信息取决于虚拟机的实现。
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异常。
来源:https://blog.csdn.net/psh1234/article/details/52097010


猜你喜欢
- 在Web开发过程中离不开数据的交互,这就需要规定交互数据的相关格式,以便数据在客户端与服务器之间进行传递。数据的格式通常有2种:1、xml;
- 本文实例讲述了Java实现SSL双向认证的方法。分享给大家供大家参考,具体如下:我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确
- 本文实例讲述了java基于JDBC连接Oracle 11g Release2的方法。分享给大家供大家参考。具体如下:Oracle 11g R
- Spring Expression Language (SpEL)是强大的表达式语言,支持查询、操作运行时对象图,以及解析逻辑、算术表达式。
- 前段时间由于VSS上的一个项目要给2个公司开发使用,而2个公司的需求不同 就把该项目复制到VSS上的另外一个目录,结果在别人的电脑取出并打开
- 写在前面并发编程一直都存在,只不过过去的很长时间里,比较难以实现,随着互联网的发展,人口红利的释放,更加友好的支持并发编程已经成了主流编程语
- 在ios7中,苹果的原生态应用几乎都能够通过向右滑动来返回到前一个页面,这样可以避免用户在单手操作时用大拇指去点击那个遥远的返回键(ipho
- 前言早期在学习泛型的协变与逆变时,网上的文章讲解、例子算是能看懂,但关于逆变的具体应用场景这方面的知识,我并没有深刻的认识。本文将在具体的场
- Maven Release当我们的项目达到了当前的目标,在经过检测后不需要改变。这时我们就需要将SNAPSHOT版本打包成RELEASE版本
- 简介我们在前面的Android教程中已经提到过这么一件事:Android在启动后会有一个主线程。它不允许任何子线程去改变主UI线程里的内容。
- 在使用C#进行相关编程的时候,有时候我们需要获取系统相关的进程信息。那么在C#中如何获取系统的所有进程那?下面请跟小编一起来操作。1、首先新
- 一、概述应用程序配置文件,对于asp.net是 web.config,对于WINFORM程序是 App.Config(ExeName.exe
- 持久层的那些事什么是 JDBCJDBC(JavaDataBase Connectivity)就是 Java 数据库连接, 说的直白点就是 使
- vscode Java 开发环境配置博客地址VsCode官网教程系统需安装jdk1.8,配置好环境变量JAVA_HOME 打开vscode,
- 一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片废话不多说,没图没真相,先上图吧
- 本文实例讲述了Android开发使用HttpURLConnection进行网络编程。分享给大家供大家参考,具体如下:——HttpURLCon
- 本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程。基本原理通用 Mapper 提供了一些通用的方法,这些通用方
- 图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以
- Spring多数据源实现的方式大概有2中,一种是新建多个MapperScan扫描不同包,另外一种则是通过继承AbstractRoutingD
- GestureDetectorGestureDetector 是手势识别的组件,可以识别点击、双击、长按事件、拖动、缩放等手势点击事件点击相