java. lang. stackoverfloweeror,java.lang.stackoverflowerror null

  java. lang. stackoverfloweeror,java.lang.stackoverflowerror null

  00-1010 java . lang . stack overflow error的成因深刻理解Java的特性。郎。堆栈溢出错误堆栈溢出错误的原因分析

  00-1010严重的3360异常初始化页面上下文Java . lang . stackoverflowerrat javax . servlet . http . http servlet requestwrapper . getsession(http servlet equestwrapper . Java :216)at org . Apache . catalina . core . application http request . getsession(application http request . Java 3360545)at javax . servlet . http . http servlet . http servlet requestwrapper . getsession(http servlet

  StackOverflow的问题一般是因为程序中可能出现无限循环或者递归调用;你可以检查程序或者增加JVM的内存。

  只需在Eclipse中JDK的配置中添加-XX : MaxDirectMemory Size=128即可。默认值是64M,加倍。如果不行,就用256。

  如果没有,估计是程序出现了死循环,或者递归调用没有写好。

  00-1010堆栈溢出错误:堆栈溢出错误。如果线程所需的堆栈大小被配置为允许最大堆栈大小,jvm将抛出堆栈溢出。

  00-10101、栈,也叫栈内存是jvm的内存模型之一。每当一个新线程启动时,jvm都会为它分配一个java栈。Jvm只会直接对java栈进行两个操作,即以帧为单位推栈和出栈。

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

  1)局部变量表:用于存储函数和局部变量的参数。局部变量表中的变量只在当前函数调用中有效。当函数调用结束后,局部变量表会随着函数栈框架的破坏而被破坏。2)操作数:主要用于保存计算过程的中间结果,也作为计算过程中变量的临时存储空间。在概念模型中,两个栈框架是相互独立的,但大多数虚拟机的实现都会进行优化,使两个栈框架部分重叠,下部的操作数栈与上部的局部变量表重叠,这样在调用方法时可以共享一部分数据,不需要额外的参数复制和传递。

  3)动态链接:每个堆栈框架都包含对运行时常量池中该堆栈框架所属方法的引用。该引用用于支持方法调用期间的动态链接。在Cl中

  ass文件的常量池中存有大量的 符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。这些符号引用一部分会在类加载阶段或第一次使用的时候转化为直接引用,这种转化 称为静态解析。另外一部分将在每一次的运行期期间转化为直接引用,这部分称为动态连接。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异常。

  以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: