Up Top

Method に関する処理 : Java のコードによるメソッド呼び出し処理 (3) : 呼び出し先(callee 側)での method entry 処理 : Template Interpreter の場合 : 一般的なメソッドの場合


概要(Summary)

一般的なメソッドの場合, エントリ部では以下のような処理が行われる.

sparc の場合

  1. 呼び出し元フレームへのローカル変数領域の挿入

    (JVM のメソッド呼び出し(invoke*)では, 引数は呼び出し元のフレームのオペランドスタックに乗っている. さらに, 引数とローカル変数は(?load/?storeで)連続的にアクセスできる仕様になっている. そこで, 呼び出し元のオペランドスタックの現在使用点の直下にローカル変数領域を確保する)

  2. 呼び出し先フレームの作成

  3. レジスタの設定(Lbcp, Lmethod, Llocals, Lmonitors, Lesp, LcpoolCache)

  4. 局所変数領域の初期化

  5. JIT コンパイル閾値の確認

  6. スタック溢れの検査 (SP の 1 ページ先にアクセスして確認)

  7. (synchronized なら) モニタの取得

  8. メソッドの最初のバイトコードに対応する codelet にジャンプして実行開始

x86_64 の場合

  1. 呼び出し元フレームへのローカル変数領域の挿入 (同上)
  2. 呼び出し先フレームの作成
  3. JIT コンパイル閾値の確認
  4. スタック溢れの検査
  5. (synchronized なら) モニタの取得
  6. メソッドの最初のバイトコードに対応する codelet にジャンプして実行開始

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

sparc の場合

InterpreterGenerator::generate_normal_entry() が生成したコード
-> (1) スタック上に新しいフレームを確保する
       -> TemplateInterpreterGenerator::generate_fixed_frame() が生成したコード

   (1) JIT コンパイラを使う場合は, invocation counter 値を増加させて値をチェックする
       -> InterpreterGenerator::generate_counter_incr() が生成したコード

   (1) stack overflow をチェックする (stack banging コード)
       -> AbstractInterpreterGenerator::bang_stack_shadow_pages() が生成したコード

   (1) synchronized method の場合はロックを取得する
       -> InterpreterGenerator::lock_method() が生成したコード
          -> (See: here for details)

   (1) メソッドの最初のバイトコードに対応するテンプレートへとジャンプする
       -> InterpreterMacroAssembler::dispatch_next() が生成するコード

x86_64 の場合

InterpreterGenerator::generate_normal_entry() が生成したコード
-> (1) stack overflow のチェックを行う.
       -> InterpreterGenerator::generate_stack_overflow_check() が生成したコード

   (1) スタック上に新しいフレームを確保する
       -> TemplateInterpreterGenerator::generate_fixed_frame() が生成したコード
        
   (1) JIT コンパイラを使う場合は, invocation counter 値を増加させて値をチェックする
       -> InterpreterGenerator::generate_counter_incr() が生成したコード

   (1) stack overflow をチェックする (stack banging コード)
       -> AbstractInterpreterGenerator::bang_stack_shadow_pages() が生成したコード

   (1) synchronized method の場合はロックを取得する
       -> InterpreterGenerator::lock_method() が生成したコード
          -> (See: here for details)

   (1) メソッドの最初のバイトコードに対応するテンプレートへとジャンプする
       -> InterpreterMacroAssembler::dispatch_next() が生成するコード

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

InterpreterGenerator::generate_normal_entry() (sparc の場合)

See: here for details

TemplateInterpreterGenerator::generate_fixed_frame() (sparc の場合)

See: here for details

MacroAssembler::calc_mem_param_words() (sparc の場合)

See: here for details

InterpreterGenerator::generate_stack_overflow_check() (sparc の場合)

See: here for details

InterpreterMacroAssembler::set_method_data_pointer()

See: here for details

AbstractInterpreterGenerator::bang_stack_shadow_pages()

See: here for details

MacroAssembler::bang_stack_with_offset() (sparc の場合)

See: here for details

InterpreterGenerator::generate_counter_incr() (sparc の場合)

(#Under Construction) See: here for details

InterpreterMacroAssembler::test_method_data_pointer() (sparc の場合)

See: here for details

InterpreterMacroAssembler::notify_method_entry()

(#Under Construction)

InterpreterRuntime::profile_method()

(See: here for details)

InterpreterGenerator::generate_counter_overflow() (sparc の場合)

(See: here for details)

InterpreterGenerator::generate_normal_entry() (x86-64 の場合)

See: here for details

InterpreterGenerator::generate_stack_overflow_check() (x86_64 の場合)

See: here for details

TemplateInterpreterGenerator::generate_fixed_frame() (x86_64 の場合)

See: here for details

InterpreterGenerator::generate_counter_incr() (x86_64 の場合)

(#Under Construction) See: here for details

MacroAssembler::bang_stack_with_offset() (x86_64 の場合)

See: here for details

InterpreterMacroAssembler::test_method_data_pointer() (x86_64 の場合)

See: here for details

InterpreterGenerator::generate_counter_overflow() (x86_64 の場合)

(See: here for details)


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