最近才发现,Sun的JDK原来对尾递归支持得并不好。
思索源自:http://www.javaeye.com/topic/198999?page=1
动手试了一下:使用递归算法将是如果重复创建list这个大集合,将引起内存溢出:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
即便在递归中及时的把集合对象设成null,也会引起堆栈溢出:java.lang.StackOverflowError
测试代码如下:
//正常运行
public class ForLoopTest {
public static void main(String[] args) {
ForLoopTest t = new ForLoopTest();
System.out.println("==================== GO ====================");
for (int i = 0; i < 10000; i++){
t.a(0);
}
System.out.println("====================OVER====================");
}
public void a(int j) {
j++;
List list = new ArrayList
(100000);
}
}
//溢出
public class TailRecursionTest {
public static void main(String[] args) {
TailRecursionTest t = new TailRecursionTest();
System.out.println("==================== GO ====================");
t.a(0);
System.out.println("====================OVER====================");
}
public void a(int j) {
System.out.println(j);
j++;
if (j == 10000)
return;
List list = new ArrayList
(100000);
list = null;//即使gc友好也会溢出
a(j);
}
}
本文通过实验展示了Sun JDK在处理尾递归时存在的问题,包括内存溢出及堆栈溢出错误。通过对比循环与递归两种方式,揭示了在进行大量递归调用时JDK的表现不足。
1210

被折叠的 条评论
为什么被折叠?



