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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值