java递归算法是否会消耗更多堆,导致额外的垃圾回收?

时间:2013-08-24 13:11:11

标签: java

如果我有两个产生相同结果的算法,第一个是基于递归而另一个是基于循环的算法,这将导致更多关于纯程序流管理的垃圾收集?

3 个答案:

答案 0 :(得分:4)

单独的递归将导致额外的堆栈使用,因为调用的每一层都是调用堆栈中的新元素,但不会使用任何额外的堆(除了可能是一个小对象或两个用户)跟踪堆栈信息 - 可能会在堆上分配,我不确定。)

但是,在典型的递归算法中,任何额外的堆对象都可能不会持续很长时间,并且将在下一代年轻代集合中进行清理。所以他们不会导致更多的垃圾收集。

答案 1 :(得分:2)

JVM将堆栈帧与堆分开。所以他们不是垃圾收集。只要您不在方法调用中初始化对象,递归就不会影响堆。这是一个article。但仍然比迭代慢,因为仍然需要额外的时间来分配堆栈帧。

答案 2 :(得分:1)

基本上(过度简化),Java内存分为两个部分,堆栈和堆。呼叫/返回在堆栈中保持跟踪,以明显的方式在呼叫中“推送”条目并在返回时“弹出”。这个方案是“自我管理”,不需要垃圾收集来保持整洁。

当然,可以在每个调用帧中分配其他基于堆的对象,但这与递归无关。一般来说,如果使用递归算法,它就不需要数据结构来跟踪在非递归情况下堆分配的进度。