它在这里说-Xss用于"设置线程堆栈大小",这究竟是什么意思?谁能帮我理解这个?
我问这个问题是为了了解如何在JVM中增加运行时调用堆栈的大小.我已经得到了答案,我还得到了许多有用的答案和评论,这些答案和评论与Java如何处理需要大型运行时堆栈的情况有关.我已经用答案摘要扩展了我的问题.
最初我想增加JVM堆栈大小,所以程序就像没有运行的程序一样StackOverflowError
.
public class TT {
public static long fact(int n) {
return n < 2 ? 1 : n * fact(n - 1);
}
public static void main(String[] args) {
System.out.println(fact(1 << 15));
}
}
Run Code Online (Sandbox Code Playgroud)
相应的配置设置是java -Xss...
具有足够大值的命令行标志.对于TT
上面的程序,它与OpenJDK的JVM一样:
$ javac TT.java
$ java -Xss4m TT
Run Code Online (Sandbox Code Playgroud)
其中一个答案还指出,这些-X...
标志是依赖于实现的.我在用
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.1) (6b18-1.8.1-0ubuntu1~8.04.3)
OpenJDK 64-Bit Server VM (build 16.0-b13, mixed mode)
Run Code Online (Sandbox Code Playgroud)
也可以仅为一个线程指定一个大堆栈(参见其中一个答案如何).建议使用此方法java -Xss...
以避免为不需要它的线程浪费内存.
我很好奇上面的程序需要多大的堆栈,所以我运行它n
增加了:
fact(1 …
我正在运行一个我在Eclipse中用Java编写的程序.对于非常大的输入,该程序具有非常深的递归级别.对于较小的输入,程序运行正常但是当给出大输入时,我得到以下错误:
Exception in thread "main" java.lang.StackOverflowError
Run Code Online (Sandbox Code Playgroud)
可以通过增加Java堆栈大小来解决这个问题,如果是这样,我该如何在Eclipse中执行此操作?
更新:
@Jon Skeet
代码以递归方式遍历解析树以构建数据结构.因此,例如,代码将使用解析树中的节点执行一些工作,并在节点的两个子节点上调用自身,将它们的结果组合在一起以给出树的整体结果.
递归的总深度取决于解析树的大小,但当递归调用的数量达到1000时,代码似乎失败(没有更大的堆栈).
此外,我很确定代码没有失败,因为它适用于小输入的bug.