java调用堆栈的最大深度是多少?

rip*_*234 94 java

在得到StackOverflowError之前,我需要多深入调用堆栈?答案平台是否依赖?

fin*_*nnw 59

它取决于分配给堆栈的虚拟内存量.

http://www.odi.ch/weblog/posting.php?posting=411

您可以使用-XssVM参数或Thread(ThreadGroup, Runnable, String, long)构造函数对其进行调整.

  • 也许您正在放置的堆栈框架的大小? (12认同)
  • 如果我们不提 Xss,那么呢? (2认同)

tro*_*roy 26

我在我的系统上测试并没有找到任何常量值,有时在8900次调用后发生堆栈溢出,有时仅在7700之后,随机数.

public class MainClass {

    private static long depth=0L;

    public static void main(String[] args){
        deep(); 
    }

    private static void deep(){
        System.err.println(++depth);
        deep();
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 是不是这是尾递归的情况,不应该溢出?编辑:对不起.在Java中它崩溃了8027; 在我感到无聊之前,它在Scala中达到了8594755. (11认同)
  • @arya是JVM语义的一个重要部分,它不支持尾递归.对于那些想要在JVM上实现带尾递归的语言的人来说,这会带来许多有趣的问题. (8认同)
  • 不支持 @ThorbjørnRavnAndersen 尾递归**优化**。很明显,您可以进行尾递归。它只是没有优化它以不增加调用堆栈。 (3认同)
  • `public foo(){试试{foo(); }最后{foo(); 只能永久地在Java中“虚拟”地运行。 (2认同)

biz*_*lop 18

可以使用-Xss命令行开关设置堆栈大小,但根据经验,它足够深,数百甚至数千个调用深度.(默认值取决于平台,但在大多数平台上至少为256k.)

如果堆栈溢出,99%的时间是由代码中的错误引起的.

  • 使用eclipse,我只能获得1024个递归调用. (6认同)
  • 第二段+1.人们应该永远记住这一点. (3认同)
  • @Norswap 你是通过堆栈跟踪的大小来确定的吗?无论堆栈的实际大小如何,这似乎都限制为 1024。 (2认同)