什么导致java.lang.StackOverflowError

什么会导致java.lang.StackOverflowError ? 我得到的堆栈打印不是很深(只有5种方法)。

检查方法的任何recusive调用。 主要是在recursion调用方法时引起的。 一个简单的例子是

 public static void main(String... args) { Main main = new Main(); main.testMethod(1); } public void testMethod(int i) { testMethod(i); System.out.println(i); } 

这里的System.out.println(i); 在调用testMethod时会被重复推送到堆栈。

JVM的(可选)参数之一是堆栈大小。 这是-Xss。 我不知道默认值是什么,但是如果堆栈中的东西总数超过了这个值,你会得到这个错误。

一般来说,无限recursion是造成这种情况的原因,但是如果你看到了这一点,你的堆栈跟踪将会有5个以上的帧。

尝试添加一个-Xss参数(或增加一个值),看看是否消失。

究竟是什么导致java.lang.StackOverflowError通常是无意的recursion。 对于我来说,通常我打算为过网方法调用超级方法。 比如在这种情况下:

 public class Vehicle { public void accelerate(float acceleration, float maxVelocity) { // set the acceleration } } public class SpaceShip extends Vehicle { @Override public void accelerate(float acceleration, float maxVelocity) { // update the flux capacitor and call super.accelerate // oops meant to call super.accelerate(acceleration, maxVelocity); // but accidentally wrote this instead. A StackOverflow is in our future. this.accelerate(acceleration, maxVelocity); } } 

首先,当我们调用一个函数时,知道幕后会发生什么是有用的。 调用方法的参数和地址被压入栈中(参见http://en.wikipedia.org/wiki/Stack_(abstract_data_type)#Runtime_memory_management ),以便被调用的方法可以访问参数,被调用的方法完成后,调用后可以继续执行。 但是由于我们正在recursion地调用this.accelerate(acceleration,maxVelocity)(方法调用时recursion是松散的,更多信息请参见http://en.wikipedia.org/wiki/Recursion_(computer_science); )我们处于一种情况称为无限recursion,并且我们继续在调用堆栈上堆栈参数和返回地址。 由于调用堆栈的大小有限,我们最终会耗尽空间。 调用堆栈上的空间不足被称为溢出。 这是因为我们正在尝试使用比我们更多的堆栈空间,数据字面上溢出堆栈。 在Java编程语言中,这会导致运行时exceptionjava.lang.StackOverflow并立即停止该程序。

上面的例子有点简单(尽pipe我发生的事情比我想承认的要多)。同样的事情可能会在更多的方面发生,使得追踪有点困难。 但是,一般来说,一旦发生,StackOverflow通常很容易解决。

从理论上讲,也有可能发生堆栈溢出而没有recursion,但实际上,这似乎是一个相当罕见的事件。

当Java应用程序调用函数调用时,会在调用堆栈上分配一个堆栈帧。 堆栈帧包含被调用方法的参数,其本地参数以及方法的返回地址。

返回地址表示执行点,在调用的方法返回之后,程序将继续执行。 如果没有空间用于新的堆栈框架,那么StackOverflowError由Java虚拟机(JVM)抛出。

可能会耗尽Java应用程序堆栈的最常见情况是recursion。

请看一看

如何解决StackOverflowError

我用hibernate创build了一个程序,在这个程序中我创build了两个POJO类,它们都是作为数据成员的对象。 当在主要的方法中,我试图将它们保存在数据库中,我也有这个错误。

发生这种情况是因为两个类都相互引用,因此创build了一个导致此错误的循环。

所以,检查你的程序是否存在这种types的关系。

在编译之前尝试清理项目

当你正在编译,当突然内存崩溃这可能会导致这个错误…

在我的情况下,我有两个活动。 在第二个活动中,我忘记了超级onCreate方法。

 super.onCreate(savedInstanceState); 

当线程堆栈继续增大时,会发生堆栈溢出exception,直到达到最大限制。

调整堆栈大小(Xss和Xmso)选项…

我build议你看到这个链接: http ://www-01.ibm.com/support/docview.wss?uid = swg21162896有一个StackOverflowError有很多可能的原因,你可以在链接中看到….