StackOverflowError については, 明示的にチェックする場合とシグナルハンドラで検出させる場合がある.
シグナルハンドラで検出させる場合には, スタックを伸ばす際に "stack banging" することで検出する (これは, 何ページか先に書き込んでみて protection ページに引っかかったら stack overflow, というチェック方法).
(<= 明示的なチェックは何故必要?? 全部 stack banging だけでも検出に問題はなさそうだが... 性能的な問題?? #TODO)
stack banging している箇所はソースコードを UseStackBanging で検索すれば分かる.
なお, UseStackBanging オプションは基本的には false にしてはいけないオプション (正しい StackOverflowError handling のためには true でないといけない). stack banging によるオーバーヘッドの計測用として実験的に false にもできるようになっている, とのこと.
((cite: hotspot/src/share/vm/runtime/globals.hpp))
develop(bool, UseStackBanging, true, \
"use stack banging for stack overflow checks (required for " \
"proper StackOverflow handling; disable only to measure cost " \
"of stackbanging)") \
(以下は一例)
(See: here for details) -> InterpreterGenerator::generate_normal_entry() が生成したコード -> TemplateInterpreterGenerator::generate_fixed_frame() が生成したコード -> InterpreterGenerator::generate_stack_overflow_check() が生成したコード -> (明示的にチェック)
(See: here for details) -> InterpreterGenerator::generate_normal_entry() が生成したコード -> AbstractInterpreterGenerator::bang_stack_shadow_pages() が生成したコード -> (stack banging)
(See: here for details) -> InterpreterGenerator::generate_normal_entry() が生成したコード -> InterpreterGenerator::generate_stack_overflow_check() が生成したコード -> (明示的にチェック)
(See: here for details) -> InterpreterGenerator::generate_normal_entry() が生成したコード -> AbstractInterpreterGenerator::bang_stack_shadow_pages() が生成したコード -> (stack banging)
(See: here for details) -> JavaCalls::call() -> JavaCalls::call_helper() -> os::stack_shadow_pages_available() -> (明示的にチェック)
(See: here for details) (See: here for details)
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.