【发布时间】:2016-06-01 18:31:11
【问题描述】:
一个用于演示的简单类:
public class Main {
private static int counter = 0;
public static void main(String[] args) {
try {
f();
} catch (StackOverflowError e) {
System.out.println(counter);
}
}
private static void f() {
counter++;
f();
}
}
上面的程序我执行了5次,结果是:
22025
22117
15234
21993
21430
为什么每次结果都不一样?
我尝试设置最大堆栈大小(例如-Xss256k)。结果会更加一致,但每次都不相同。
Java 版本:
java version "1.8.0_72"
Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode)
编辑
当 JIT 被禁用 (-Djava.compiler=NONE) 时,我总是得到相同的号码 (11907)。
这是有道理的,因为 JIT 优化可能会影响堆栈帧的大小,而且 JIT 所做的工作肯定会在执行之间有所不同。
尽管如此,我认为如果通过参考有关该主题的一些文档和/或 JIT 在此特定示例中所做的工作的具体示例来证实这一理论,这将是有益的,这会导致帧大小发生变化。
【问题讨论】:
-
主机操作系统为 JVM 提供的资源因程序的不同执行而异,因此最大堆栈大小也不同也就不足为奇了。
-
你不能在
main()中递归吗?
标签: java recursion stack stack-overflow