StackOverflowError をキャッチしようとするとどうなるのだろうと思っていて、次の方法を思いつきました。
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
今私の質問:
このメソッドが「4」を出力するのはなぜですか?
コール スタックに 3 つのセグメントが必要だからかもしれないと思ったSystem.out.println()
のですが、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 または他の何かにあるのかについてです。システム。