1. ホーム

[解決済み】Stack Overflowのエラーは実際に何が原因なのでしょうか?重複

2022-04-16 06:08:28

質問

あちこち探したのですが、確かな答えが見つかりません。ドキュメントによると、Javaは java.lang.StackOverflowError というエラーが発生します。

アプリケーションが深く再帰したためにスタックオーバーフローが発生したときにスローされます。

しかし、これには2つの疑問が残ります。

  • スタックオーバーフローが発生する方法は、再帰だけでなく、他にもあるのでは?
  • StackOverflowErrorは、JVMが実際にスタックをオーバーフローする前に発生するのですか、それとも後に発生するのですか?

2つ目の質問について詳しく説明します。

JavaがStackOverflowErrorを投げるとき、スタックがヒープに書き込まれなかったと安全に判断できるのか?スタックオーバーフローを投げる関数の try/catch でスタックまたはヒープのサイズを縮小した場合、作業を継続できますか?これはどこかに文書化されていますか?

求めていない回答

  • StackOverflowが発生するのは、再帰性が悪いからです。
  • ヒープとスタックがぶつかるとStackOverflowが発生します。

解決方法は?

と考えているようですが スタックオーバーフローエラー は、ネイティブ・プログラムにおけるバッファ・オーバーフロー例外のようなもので、バッファに割り当てられていないメモリに書き込むと、他のメモリ・ロケーションを破壊してしまう危険があります。そのようなことはありません。

JVMは、各スレッドのスタックに割り当てられた所定のメモリを持っており、メソッドを呼び出そうとしたときに、たまたまこのメモリがいっぱいになってしまうと、JVMはエラーを投げます。ちょうど、あなたが長さNの配列のインデックスNに書き込もうとした場合のように、メモリ破壊は起こりえません。スタックは、ヒープに書き込むことができません。

StackOverflowError は、スタックにとっての OutOfMemoryError、ヒープにとっての OutOfMemoryError であり、単に利用できるメモリがもうないことを知らせるものです。

仮想マシンエラー (§6.3) からの説明

<ブロッククオート

StackOverflowError(スタックオーバーフローエラー : Java仮想マシンの実装がスレッドのスタック領域を使い果たした。典型的には、実行中のプログラムの障害により、スレッドが無制限の数の再帰的呼び出しを行ったためである。