2013-01-15 31 views
3

我是編程新手,我試圖自學一個StackOverflow是由什麼引起的。我玩過循環並導致錯誤,但是我測試的代碼不會導致錯誤。爲什麼是這樣?爲什麼Java的forkbomb不會導致StackOverflowError?

public class ForkBomb 
{ 
    public static void main(String[] args) throws java.io.IOException 
    { 
    while(true) 
    { 
     Runtime.getRuntime().exec(new String[]{"java", "-cp", System.getProperty("java.class.path"), "ForkBomb"}); 
    } 
    } 
} 

這不會導致堆棧溢出。爲什麼?然而,這導致一個:

public class WhileBomb 
{ 
    public WhileBomb() 
    { 
     while (true) 
     { 
     new WhileBomb(); 
     } 
    } 

    public static void main(String[] args) throws java.io.IOException 
    { 
    WhileBomb goodBye = new WhileBomb(); 
    } 
} 

回答

9

每個線程都有自己的堆棧。當你創建一個新的進程時,你也會得到一個新的線程和一個新的堆棧。堆棧溢出錯誤發生在單個堆棧被填滿時,但您正在創建許多不同的堆棧,其中沒有一個堆滿。

在第二個示例中,您只有一個線程,並且您有一個遞歸調用。每次調用方法時,都會暫時將一些信息存儲在堆棧中,直到方法返回。因爲你的方法永遠不會返回,堆棧將被消耗,直到你得到堆棧溢出異常。

你甚至不需要while循環。這也會導致堆棧溢出異常:

public WhileBomb() 
{ 
    new WhileBomb(); 
} 
+0

我的回答太慢,但只要問題是關於「破壞性」的編程,每個人都會覺得被說出來......':D' – Nippey

+0

@Nippey更不用說它包含充足的引用名稱我們心愛的論壇。 – Agentlien

+0

非常感謝你的回答!現在,如果我只理解線程是什麼,以及forkbomb線如何工作...... – user1901074

1

堆棧溢出是由於使用更多的堆棧空間而導致的。叉式炸彈通過產生大量新進程來減慢PC的速度,每個進程都會繼續產生更多(等等)。

叉炸彈不會導致堆棧溢出的原因是每個進程都有它自己的堆棧,因此在任何進程中實際上並沒有使用太多的堆棧空間,只創建了很多每個都有自己的進程小)堆棧。

2

第一個例子是沒有添加任何東西到堆棧,它創建了全新的堆棧。然而,第二個示例增加了堆棧:

public WhileBomb() 
{ 
    while (true) 
    { 
     new WhileBomb(); 
    } 
} 

你在這裏看到的是一個無限遞歸。創建一個WhileBomb對象涉及創建一個WhileBomb對象。這一切都發生在同一個程序的同一個線程中(而不是分出一個新線程),所以它在同一個棧中。在線程中創建新的WhileBomb會將其自身的另一個實例添加到堆棧中。

相關問題