2013-07-09 85 views
1

大家都知道,大多数所有的递归函数都可以修改为迭代方法。假设我们举一个添加两个代表两个巨大数字的链表的例子。这个问题可以通过递归(使用系统堆栈)或迭代(显式堆栈使用)方法来解决。递归系统堆栈分配

我的疑问是,如果我已经给jvm堆大小为-Xms2048MB -Xmx2048M那么在递归方法中它会使用所有的堆内存的系统堆栈? AFAIK如果我将使用显式堆栈,那么它可以消耗所有这些内存。如果有人可以告诉我如何分配系统堆栈内存,分配多少内存以及如何工作,这将非常棒。即使指向一些不错的教程也会有很大的帮助。如果可以限制w.r.t则尽可能java世界然后它是好的。谢谢。

+0

注意JVM:一'String'是它可以在堆栈上的引用,但实际的对象是在堆上。如果你使用对象,你应该假设他们会使用堆空间,不管你做什么。 –

+0

顺便说一句我只会写'-Xmx2g'或者'-mx2g'或者没有设置全部,默认是主内存大小的1/4,只要你有一台像样的机器,你可能不需要设置它。 –

回答

2

这是不可能发生的,因为堆栈帧具有其自己的大小。这个大小可以通过命令行参数-Xss<size>进行调整。

堆内存完全与堆栈内存分离。

默认堆栈大小取决于你正在运行

+1

+1堆栈不使用任何堆,但引用的任何对象仍将堆在堆上。例如如果通过递归或迭代使用对象,则它们位于堆上,而不是堆栈中。 –

+1

@PeterLawrey这是一个有效的点,但从我如何理解原始海报想要知道堆栈是否吃完所有堆的问题...... –

+1

是真实的,但堆栈可能不会按照OP认为的和OP的方式吃掉在用完堆栈之前用完堆,从而造成混乱。 –