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ランタイム環境(ビルド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と