ホームページ > Java > &#&チュートリアル > StackOverflowErrors を防ぐために Java スタック サイズを増やすにはどうすればよいですか?

StackOverflowErrors を防ぐために Java スタック サイズを増やすにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-17 02:35:25
オリジナル
836 人が閲覧しました

How Can I Increase the Java Stack Size to Prevent StackOverflowErrors?

呼び出しスタックを大きくするために 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート