StackOverflowErrorとは何ですか?質問する

StackOverflowErrorとは何ですか?質問する

とは何かStackOverflowError、その原因は何なのか、そしてどのように対処すればよいのか?

ベストアンサー1

パラメータとローカル変数はスタック上に割り当てられます(参照型の場合、オブジェクトはヒープ上に存在しスタック内の変数はヒープ上のそのオブジェクトを参照します)。スタックは通常、アドレス空間の上端に存在し使い果たされるとアドレス空間の下端(つまり、ゼロ) に向かって移動します。

プロセスにはヒープもあり、これはプロセスの下端に存在します。メモリを割り当てると、このヒープはアドレス空間の上端に向かって大きくなります。ご覧のとおり、ヒープがスタックと「衝突」する可能性があります(地殻プレートのように!!!)。

スタック オーバーフローの一般的な原因は、不適切な再帰呼び出しです。通常、これは再帰関数に適切な終了条件がなく、それ自体を永久に呼び出し続ける場合に発生します。または、終了条件が適切である場合、条件を満たすまでに必要となる再帰呼び出しが多すぎることが原因で発生することがあります。

ただし、GUI プログラミングでは、間接的な再帰を生成することができます。たとえば、アプリがペイント メッセージを処理し、その処理中に、システムに別のペイント メッセージを送信させる関数を呼び出す場合があります。ここでは、明示的に自分自身を呼び出していませんが、OS/VM が代わりに呼び出しています。

これらに対処するには、コードを調べる必要があります。自分自身を呼び出す関数がある場合は、終了条件があるかどうかを確認してください。終了条件がある場合は、関数を呼び出すときに少なくとも引数の 1 つを変更したことを確認してください。そうでない場合、再帰的に呼び出された関数に目に見える変更はなく、終了条件は役に立ちません。また、有効な終了条件に達する前にスタック スペースがメモリ不足になる可能性があることにも注意してください。そのため、メソッドが、より多くの再帰呼び出しを必要とする入力値を処理できることを確認してください。

明らかな再帰関数がない場合は、間接的に関数が呼び出されるライブラリ関数を呼び出していないかどうかを確認します (上記の暗黙的なケースのように)。

おすすめ記事