1

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

4

3 回答 3

4

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

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

于 2013-08-24T13:14:46.187 回答
2

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

于 2013-08-24T13:29:47.357 回答
1

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

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

于 2013-08-24T13:34:09.243 回答