ホームページ >Java >&#&チュートリアル >Java スタック サイズを増やして StackOverflowError を回避するにはどうすればよいですか?

Java スタック サイズを増やして StackOverflowError を回避するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-25 18:58:13149ブラウズ

How to Increase Java Stack Size and Avoid StackOverflowError?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。