再帰の深さの決定
再帰の最大の深さを測定するには、多くの場合、現在のスタックの深さと再帰のレベルをカウントすることが望ましいです。これは、StackOverflowError をトリガーする前に実行できます。
スタック深度のカウント
メソッド levelDeep() は、例外を生成してキャッチし、検査することによって現在のスタック深さを決定することを目的としています。結果のスタック トレース。ただし、最大深さ 1024 という制限がハードルになります。
再帰レベルのカウント
stackLeft() メソッドは、再帰的に残りのスタックの深さをカウントしようとします。 StackOverflowError が発生するまで自分自身を呼び出します。これは信頼できるアプローチのようです。
Java 8 の非決定的なスタック深さ
予期せず、特定のバージョンの Java (Oracle Java など) で stackLeft() を使用すると、 8) 非決定的な結果が得られます。最大再帰深さは、約 18,500 ~ 20,700 の間で変化します。この動作は、深さが一貫している OpenJDK 7 では観察されません。
非決定性の原因
この非決定的な動作は、Java のホットスポット間の相互作用に起因します。オプティマイザーと次のようなさまざまな要素:
したがって、Java 8 の最大再帰の深さは、これらの要因の組み合わせに応じて変化する可能性があります。それは非決定的です。
以上がJava 8 の JIT 最適化は最大再帰深さにどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。