呼び出しスタックを大きくするために Java スタック サイズを増やす
Java 仮想マシン (JVM) は、各スレッドの実行時呼び出しスタックを維持します。スタック サイズが深い呼び出しスタックを処理するには不十分な場合、StackOverflowError が発生します。より大きな呼び出しスタックに対応するためにこのスタック サイズを拡張するには、java -Xss... コマンドライン フラグを利用します。
たとえば、コード スニペットでは次のようになります。
public class TT { public static long fact(int n) { return n < 2 ? 1 : n * fact(n - 1); } }
fat(2^15) 計算では、以下:
java -Xss4m TT
実装固有およびスレッド固有のスタック構成
-X... フラグは実装に依存することに注意してください。あなたの場合は、OpenJDK の JVM を使用しています。さらに、特定のスレッドにのみより大きなスタック サイズを指定して、それを必要としないスレッドによるメモリの無駄を避けることができます。これは、java -Xss を使用するよりも推奨されます....
必要なスタック サイズの見積もり
プログラムに必要な正確なスタック サイズを決定するには、- を徐々に増加させます。 StackOverflowError が発生せずに目的の計算が処理されるまでの Xss 値。
非決定的動作
スタック要件は非決定的な場合があります。ガベージ コレクションや JIT コンパイルなどの要因が、この動作に影響を与える可能性があります。
代替実装: 反復と再帰
アルゴリズムのスタック負荷の少ない代替実装を検討してください。ファクト関数の場合、反復実装によりスタック オーバーフローが発生しにくくなります。
public class TTIterative { public static long fact(int n) { if (n < 2) return 1; if (n > 65) return 0; long f = 2; for (int i = 3; i <= n; ++i) { f *= i; } return f; } }
ファクト関数は、long データ型の制限のため、65 を超える数値の正確な階乗を計算できないことに注意してください。この制限を克服するには、代わりに BigInteger を返すことを検討してください。
以上がStackOverflowErrors を防ぐために Java スタック サイズを増やすにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。