2014-03-27 41 views
0

我一直在試圖解決我的Java代碼中由於我正在執行的遞歸而發生的堆棧溢出異常。我知道在Eclipse IDE中增加堆棧大小可以解決這個問題。我想知道,如果這個異常,就像我們創建一個可執行文件並運行一樣,發生在JVM中。操作系統是否不關心該可執行文件所需的內存?發生在JVM中的堆棧溢出異常發生在可執行文件中

+0

您必須爲操作提供最大允許內存。舉一個簡單的例子,如果你的代碼無限運行,並且JVM正在爲它分配所有可用的內存,所有它。會發生什麼?? –

+0

感謝您的快速回復。 1.我的代碼無法無限運行。它只是根據輸入做更多的遞歸。我已經增加了JVM的堆棧大小,它運行良好。 2.我擔心如果使用相同的代碼創建一個exe並運行,會發生什麼情況。 – Sujju

+0

那麼,我不是在談論你的代碼。我只是給你一個例子。 ;) –

回答

0

運行應用程序時使用的內存有兩種不同的類型(概念上)。

堆是正在創建和存儲對象實例的位置。這是內存的主要部分,也是由JVM收集的垃圾,操作系統確實負責將這些內存分配給您的應用程序。話雖如此,JVM總是以它可能從OS獲得的最大內存量的某種配置啓動(這是可配置的)。

第二種類型的內存稱爲堆棧,它由JVM在內部用於支持方法調用。當你調用一個方法時,你傳遞給該方法的參數被放置在堆棧上,並且每當你引用一個方法參數時被引用。堆棧的另一個用法是用於方法局部變量(即,您在方法中定義的變量)。

當您用完堆棧時會發生堆棧溢出(多麼令人驚訝)。由於它的使用性質,棧比堆更有限,不應該被濫用。如果你有遍歷整個樹/層次結構的遞歸方法,並且你得到了一個點,在那裏你會得到大輸入的堆棧溢出異常,這肯定是一個標誌,你應該將你的遞歸轉換爲迭代(參見:Design patterns for converting recursive algorithms to iterative ones

相關問題