2017-05-03 18 views
0

再帰的プログラムを実行すると、Java StackOverFlowErrorが実行されています。プログラムは正しいですし、再帰を実装する必要があります。私は、コマンドJava stackoverflowerror使用する正しいスタックサイズは何ですか?

java -XX:+PrintFlagsFinal -version | grep ThreadStackSize 

を使用して、現在のスタックサイズを見つけることを試みた、これは私が得たものである:

intx CompilerThreadStackSize     = 0         {pd product} 
intx ThreadStackSize       = 1024        {pd product} 
intx VMThreadStackSize       = 1024        {pd product} 

Javaバージョン "1.8.0_101" のJava(TM)SEランタイム環境(1.8を構築します.0_101-b13) Java HotSpot(TM)64ビットサーバーVM(ビルド25.101-b13、混合モード)

これはどういう意味ですか?そして、スタックサイズを増やすにはどうしたらいいですか?上記の設定でこのエラーが発生するのは正常ですか?お手伝いください。

+0

また、再帰的タスクを実行するためのForkおよびJoinフレームワークを見てください。 https://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html –

+1

'プログラムは正しいです。この例外が発生している場合、これを知っていますか? –

答えて

3

再帰的コードを記述しており、再帰を終了させるコードがない場合、スタックサイズがどれほど高いかにかかわらず、最終的にスタックオーバーフローエラーが発生します。

コードを修正する以外に何もできないため、このエラーが発生します。

+0

無限再帰があると仮定します。これはそうではないかもしれません(OPは "プログラムは正しい"と書いています)。一部の再帰ではデフォルトでavailbaleよりスタックが必要です。 – Henry

+0

@Henry、それは私の 'whoint recursion'を書いたユーザーではありませんHarmlezz :) –

+0

「再帰を終了するコードがありません」とまったく同じではありませんか? – Henry

1

スタックサイズが1MB(1024KB)であることを示します。そして、あなたは、スレッドごとに32メガバイトにスタックサイズを設定するには、たとえば、-Xss<size>を渡すことで、スレッドのスタックサイズを増やすことができます。

java -Xss32m 

通常1メガバイトのスタックサイズは十分です。私が取り組んだプロジェクトのほとんどで、スタックサイズを変更する必要はほとんどありません。だからあなたのコードはあなたが思っている通りに正しくない可能性があります。

+0

ありがとう、もう一度確認します。 – developer3

関連する問題