この方法で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」が出力されるのはなぜですか? おそらく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または他の何かがあるのはなぜですかシステム。