我想知道当您尝试捕获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(内部版本1.6.0_41-b02),
Java HotSpot(TM)64位服务器VM(内部版本20.14-b01,混合模式)获得了结果4。
解释为什么我认为这个问题与理解Java堆栈不同:
我的问题不是关于为什么cnt> 0(显然是因为System.out.println()
需要堆栈大小并且StackOverflowError
在打印某些内容之前会抛出另一个),而是为什么它具有4的特定值,分别是0、3、8、55或其他值系统。
5
,6
并38
与Java 1.7.0_10