Tag: stack size

计算方法调用堆栈大小以检查StackOverflowException

今天早上我回答了一个与StackoverflowException相关的问题。 该人询问何时发生Stackoverflowexception 查看此链接在C#,C ++和Java中导致堆栈溢出的最简单方法 所以我的问题是,有没有任何方法可以在程序中动态计算方法调用堆栈大小,然后在调用方法之前应用检查,该方法检查方法调用堆栈是否有空间来容纳它,以防止StackOverflowException。 因为我是一个java人,我正在寻找java,但也寻找与概念相关的解释,没有任何编程语言的限制。

为什么最大递归深度我可以达到非确定性?

我决定尝试一些实验,看看我能发现堆栈帧的大小,以及当前执行代码在堆栈中的距离。 我们可能会在这里调查两个有趣的问题: 当前代码的深度是多少级别? 当前方法遇到StackOverflowError之前可以达到多少级别的递归? 堆栈当前执行代码的深度 这是我能想到的最好的: public static int levelsDeep() { try { throw new SomeKindOfException(); } catch (SomeKindOfException e) { return e.getStackTrace().length; } } 这看起来有点黑客。 它生成并捕获exception,然后查看堆栈跟踪的长度。 不幸的是,它似乎也有一个致命的限制,即返回的堆栈跟踪的最大长度为1024.除此之外的任何内容都被削减,因此此方法可以返回的最大值为1024。 题: 有没有更好的方法做到这一点,不是那么hacky并没有这个限制? 对于它的价值,我的猜测是没有: Throwable.getStackTraceDepth()是一个本机调用,它建议(但不能certificate)它不能用纯Java完成。 确定我们剩下多少递归深度 我们可以达到的等级数量将由(a)堆栈帧的大小和(b)剩余堆栈量确定。 让我们不要担心堆栈帧的大小,只需看看在我们遇到StackOverflowError之前我们可以达到多少级别。 这是我执行此操作的代码: public static int stackLeft() { try { return 1+stackLeft(); } catch (StackOverflowError e) { return 0; } } 它的工作令人钦佩,即使它在堆栈剩余量方面是线性的。 […]