[解決済み】Stack Overflowのエラーは実際に何が原因なのでしょうか?重複
質問
あちこち探したのですが、確かな答えが見つかりません。ドキュメントによると、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仮想マシンの実装がスレッドのスタック領域を使い果たした。典型的には、実行中のプログラムの障害により、スレッドが無制限の数の再帰的呼び出しを行ったためである。
関連
-
[解決済み] JVM起動時のパラメータ「-Xms」「-Xmx」とは何ですか?
-
[解決済み] Java - JTextFieldが空かどうかを確認する
-
[解決済み] SubclipseとJavaHLのインストールで頭を悩ます
-
[解決済み] Maven: assembly-pluginが全く実行されない
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] JavaBeanとは何ですか?
-
[解決済み] スタックトレースを文字列に変換するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] HashMapのtoString関数はなぜ異なる順序で自分自身を印刷するのですか?
-
[解決済み] ボタンでTextFieldをクリアする(Java)
-
[解決済み] パラメータ[変数]の不正な修飾子;finalのみが許可される[closed]。
-
[解決済み] java.util.MissingFormatArgumentException: 形式指定子 '%s' がありません。
-
[解決済み] HTTP ステータス 500 - サーブレットクラス pkg.coreServlet のインスタンス化に失敗しました。
-
[解決済み] SubclipseとJavaHLのインストールで頭を悩ます
-
[解決済み] Maven: assembly-pluginが全く実行されない
-
[解決済み] java swingアプリケーションでJCEがプロバイダBCを認証できない
-
[解決済み] x--やx++はここで何をするのですか?
-
[解決済み] StackOverflowErrorとは何ですか?