为什么这种方法打印4?
我想知道当你尝试捕获StackOverflowError并提出以下方法时会发生什么:
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
现在我的问题:
为什么此方法打印“4”?
我想也许是因为调用堆栈上需要3个段,但我不知道数字3来自哪里。当您查看 的源代码(和字节码)时,它通常会导致比 3 个更多的方法调用(因此调用堆栈上的 3 个段是不够的)。如果是因为热点VM应用的优化(方法内联),我想知道在另一个VM上的结果是否会有所不同。System.out.println()
System.out.println()
编辑:
由于输出似乎是高度特定于JVM的,因此我使用
Java(TM)SE运行时环境(构建1.6.0_41-b02)
Java HotSpot(TM)64位服务器VM(构建20.14-b01,混合模式)获得结果4
解释为什么我认为这个问题与理解Java堆栈不同:
我的问题不是为什么有一个cnt>0(显然是因为需要堆栈大小并在打印某些东西之前抛出另一个),而是为什么它的特定值分别为0,3,8,55或其他系统。System.out.println()
StackOverflowError