2010-06-17 85 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

相關問題