Sun的JDK对尾递归支持不好

最近才发现,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对尾递归支持不好)