2014-03-27 17 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

相关问题