2013-07-09 124 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的方式吃掉在用完堆棧之前用完堆,從而造成混亂。 –