Java スタック サイズを増やす方法 (Xss パラメーター)
JVM でランタイム スタックの容量を増やすには、'-Xss を利用します。 ' コマンドライン フラグを適切な値に設定します。 'TT' プログラム (1
$ javac TT.java $ java -Xss4m TT
'-X...' フラグの実装依存性
「-X...」フラグは実装固有であることに注意してください。提供されている Java バージョンでは、「-Xss」フラグはすべてのスレッドのスタック サイズを制御します。
スレッド固有のスタック割り当て
または、十分なスタック サイズを割り当てることもできます。 java.lang.Thread.stackSize() メソッドを使用して、特定のスレッドにスタック サイズを設定します。このアプローチは、スタック要件が控えめなスレッドのメモリの浪費を防ぐため、有利です。
スタック要件の決定
プログラムに必要なスタック サイズを測定するには、プログラムを繰り返し実行します。 「StackOverflowError」が発生せずに正常に実行されるまで、スタック サイズを増やします。 「TT」プログラムの場合、スタック サイズは次のように決定されました。
-Xss4m: suffices for (1 << 15) -Xss5m: suffices for (1 << 17) ... -Xss515m: suffices for (1 << 25)
非決定的なスタック要件現象
次のような要因により、スタック要件は非決定的な動作を示す可能性があります。ガベージ コレクションと JIT の実行タイミング。到達したスタックの深さを正確に計算するには、以下の回答を参照してください (Javassist を使用)。
代替実装
スタック消費量が少ない代替アルゴリズムを検討してください。 「fact」関数の場合、反復実装を利用して再帰を回避し、スタック使用量を削減できます。
public class TTIterative { // ... implementation ... }
BigInteger に関する考慮事項
「fact」関数は次のことを行うことができません。オーバーフローのため、「long」データ型を使用して 65 を超える数値の正確な階乗を計算します。 「BigInteger」を返すように関数をリファクタリングすると、この問題が解決され、より大きな入力に対して正確な結果が得られます。
以上がJava スタック サイズを増やして StackOverflowError を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。