显然,这是JVM特定的,也可能是特定于体系结构的。
我测量了以下内容:
static int i = 0; public static void rec0() { i++; rec0(); } public static void main(String[] args) { ... try { i = 0; rec0(); } catch (StackOverflowError e) { System.out.println(i); } ... }使用
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)
在x86上运行。
使用20MB
Java堆栈(
-Xss20m),每次调用的摊销成本在16-17字节左右波动。我所看到的最低值是16.15字节/帧。因此,我得出的结论是开销为16个字节,其余为其他(固定)开销。
一个函数
int的成本基本相同,每帧16字节。
有趣的是,一个占用10位的函数
ints需要32字节/帧。我不知道为什么成本这么低。
以上结果在将代码进行JIT编译后适用。在编译之前,每帧成本 要 高得多。我还没有找到一种可靠的方法来估算它。
但是,这确实意味着您没有希望可靠地预测最大递归深度,直到可以可靠地预测是否已对JIT编译了递归函数。
所有这些都通过
ulimit128K和8MB 的堆栈大小进行了测试。在两种情况下结果都是相同的。



