Up Top

Exception の処理 : 処理の詳細 (1) : 例外送出条件の検出処理 : signal handler で検出する例外 : StackOverflowError の検出処理 : Template Interpreter の場合


概要(Summary)

StackOverflowError については, 明示的にチェックする場合とシグナルハンドラで検出させる場合がある.

シグナルハンドラで検出させる場合には, スタックを伸ばす際に "stack banging" することで検出する (これは, 何ページか先に書き込んでみて protection ページに引っかかったら stack overflow, というチェック方法).

(<= 明示的なチェックは何故必要?? 全部 stack banging だけでも検出に問題はなさそうだが... 性能的な問題?? #TODO)

備考(Notes)

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)")                                               \

処理の流れ (概要)(Execution Flows : Summary)

(以下は一例)

sparc の場合

(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)

x86_64 の場合

(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()
         -> (明示的にチェック)

処理の流れ (詳細)(Execution Flows : Details)

(See: here for details) (See: here for details)


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.