我想知道当您尝试捕获 StackOverflowError 并想出以下方法时会发生什么:
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
现在我的问题:
为什么这个方法打印'4'?
我想可能是因为System.out.println()
调用堆栈上需要 3 个段,但我不知道数字 3 来自哪里。当您查看 的源代码(和字节码)时System.out.println()
,通常会导致比 3 多得多的方法调用(因此调用堆栈上的 3 个段是不够的)。如果是因为 Hotspot VM 应用的优化(方法内联),我想知道结果在另一个 VM 上是否会有所不同。
编辑:
由于输出似乎与 JVM 高度相关,我使用
Java(TM) SE Runtime Environment (build 1.6.0_41-b02)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode)得到结果 4
解释为什么我认为这个问题与理解 Java 堆栈不同:
我的问题不是关于为什么有一个 cnt > 0 (显然是因为System.out.println()
需要堆栈大小并StackOverflowError
在打印某些内容之前抛出另一个),而是为什么它具有特定值 4,分别为 0、3、8、55 或其他系统。