2010-06-17 60 views

回答

15

当太多的数据被放置在stack,这是一种有限的资源时,会发生堆栈溢出。

下面是一个例子:

public class Overflow { 
    public static final void main(String[] args) { 
     main(args); 
    } 
} 

这个函数调用自身多次与没有终止条件。因此,堆栈填满是因为每次调用都必须在堆栈上推送一个返回地址,但返回地址永远不会从堆栈弹出,因为该函数永远不会返回,它只会不断调用它自己。

0

通常当递归方法被调用的次数太多时。例如:

public void doSomething(int time) 
{ 
    System.out.println("do #" + (doSomething(time++))); 
} 
8

在Java中没有像StackOverFlowException这样的东西。

有,然而,一个名为StackOverflowErrorthe documentation类说:

时发生堆栈溢出,因为应用程序递归太深而引发。

如果你不知道堆栈是什么,这样说的:Call stack

+2

@唐:请不要删除我的部分答案。我已回滚您的删除。 – Jesper 2010-06-17 11:28:32

+0

我删除它,因为我也改变了这个问题,所以你的答案的一部分没有意义了 – 2010-06-17 14:35:05

+0

为什么当我用一个新的对象创建无限循环时不会发生错误。 – Sridhar 2015-08-13 07:41:49

4

每次调用一个函数,一小块特殊的内存区域 - 栈 - 被分配给它,并持有局部变量和函数的上下文。如果我们的函数调用另一个函数,那么下一个函数将被切断,等等。当函数再次返回时,堆栈会缩小。如果嵌套级别太高,可能会溢出。

这是一个非常普遍的概念。在Java上,超过堆栈大小时会引发StackOverflowError。这是一个错误,而不是例外,因为你被要求避免这种情况,不能从中恢复。

典型的例子是无限递归:

public void foo(int i) { 
    return foo(i+1); 
} 
-1

Java的机器分配程序的内存特定数量。错误是由程序使用太多内存引起的。上面的例子很好,但是如果你正在尝试创建一个非常大的数组,并且可能导致它溢出。 您可以通过使用命令行参数

java -Xmx200m YOUR_PROGRAM_CLASS 

这将减少你得到一个StackOverFlowException的机会分配更多的内存(200MB的这个例子中)到你的程序。

This Explains the command line options

http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html#Xms

+1

-1:即使存在大量堆内存,StackOverflowError也会发生 – 2010-06-17 19:08:50

+0

但是错误的根本原因仍然相同,内存太多。您可以通过增加堆大小或更改程序来更有效地使用内存来解决此问题。 – Lee 2010-06-17 21:52:16

相关问题