我想知道当你试图捕捉一个 StackOverflow 错误时会发生什么,并且想出了下面的方法:
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 (商标)系统工程执行期函式库(build 1.6.0 _ 41-b02)
Java HotSpot (TM)64位服务器 VM (build 20.14-b01,混合模式)
解释为什么我认为这个问题不同于 了解 Java 堆栈:
我的问题不是为什么 cnt > 0(显然是因为 System.out.println()
需要堆栈大小,在打印之前抛出另一个 StackOverflowError
) ,而是为什么它在其他系统上的特定值分别为4、0、3、8、55或其他值。