2011-09-13 39 views
-6
public class TailRecursionTest2 { 
    public static void main(String[] args) { 
     TailRecursionTest2 t = new TailRecursionTest2(); 
     t.a(0); 
    } 
    public void a(int j) { 
     System.out.println(j); 
     j++; 
     if (j == 10000) 
      return; 
     List list = new Array List<Integer>(100000); 
} 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at java.util.ArrayList. <init> (Unknown Source) 
     at TailRecursionTest2.a (TailRecursionTest2.java: 17) 
     at TailRecursionTest2.a (TailRecursionTest2.java: 20) 
     at TailRecursionTest2.a (TailRecursionTest2.java: 20) 
     at TailRecursionTest2.a (TailRecursionTest2.java: 20) 
     at TailRecursionTest2.a (TailRecursionTest2.java: 20) 
+2

壞的編輯,毫無疑問。你的問題將很快關閉。 –

+2

請添加一些示例代碼,否則無法回答。 –

+0

毫無疑問...... – chepseskaf

回答

1

這個問題,你可以猜測是你有一個記憶韭菜,因爲堆已滿。您可以通過增加Java堆空間來修復它,但問題可能與您的代碼有關,因爲這些代碼可能無法正確釋放變量,或者您的遞歸函數沒有「退出點」(檢查迭代條件)

1

不能看到你的代碼,我可以建議你最有可能遞歸太深。

檢查您的遞歸終止條件是否理智,以及您的開始條件是否理智。

基本上,你正在把這麼多東西推到堆上,JVM放棄並在巴厘島上繪製海鷗。

+0

推測,但+1,因爲可能會爲其他提供指導。 –

+0

如果應用程序本身需要比默認更大的堆棧,該怎麼辦? – Santosh

+0

應用程序的名稱(TailRecursionTest)使我相信事實並非如此,並且OP是沒有設置任何終止條件的情況。 – mcfinnigan

-1

始終使在您的程序中使用的arraylist和其他引用在finally塊中爲null。 節省了大量的頭痛:)

-Lav

+0

-1顯式地將對象置零是被認爲是不好的做法。你很少有這樣的場合。 – helpermethod