Up Top

JIT Compiler の処理 (1) : JIT コンパイルを開始する処理 : 実行回数が閾値を超えたことによる開始処理 : (1) 閾値のチェック処理 : メソッドの呼び出し回数のチェック処理 : Template Interpreter の場合


概要(Summary)

Template Interpreter の場合, メソッドの呼び出し回数のチェックは以下の箇所で行われる.

アーキテクチャ(sparc, x86)によって若干処理に違いはあるが, どちらも InterpreterGenerator::generate_counter_incr() が生成したコードでカウンタ値をチェックし, 閾値を超えていれば InterpreterGenerator::generate_counter_overflow() が生成したコードが InterpreterRuntime::frequency_counter_overflow() を呼び出す. これにより CompilationPolicy オブジェクトが呼び出され, JIT コンパイル処理が開始される.

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

実行回数が閾値を越えたメソッド (非 native method) の場合

(See: here for details)
-> InterpreterGenerator::generate_normal_entry() が生成したコード
   -> (1) JIT コンパイラを使う場合は, invocation counter 値を増加させて値をチェックする
          -> InterpreterGenerator::generate_counter_incr() が生成したコード
             -> * TieredCompilation が有効な場合:
                  -> (1) methodDataOopDesc が付いていれば (& ProfileInterpreter が有効ならば), 
                         methodDataOopDesc 内の _invocation_counter のカウンタ値をインクリメントしてチェックする
                         -> InterpreterMacroAssembler::increment_mask_and_jump() が生成したコード
                     (1) そうでなければ, 
                         methodOopDesc 内の _invocation_counter のカウンタ値をインクリメントしてチェックする
                         -> InterpreterMacroAssembler::increment_mask_and_jump() が生成したコード
                * TieredCompilation が無効な場合:
                  -> (1) methodOopDesc 内の _invocation_counter のカウンタ値をインクリメントする
                     (1) ProfileInterpreter が有効ならば, 
                         methodOopDesc 内の _interpreter_invocation_count のカウンタ値をインクリメントする
                     (1) methodOopDesc 内の _invocation_counter のカウンタ値 (+ _backedge_counter のカウンタ値) をチェックする

      (1) チェックした値が JIT コンパイル対象になる閾値を超えていれば, CompilationPolicy オブジェクトを呼び出す
          -> InterpreterGenerator::generate_counter_overflow() が生成したコード
             -> InterpreterRuntime::frequency_counter_overflow()
                -> InterpreterRuntime::frequency_counter_overflow_inner()
                   -> CompilationPolicy::event()  (を各サブクラスがオーバーライドしたもの)
                      -> (See: here for details)

      (1) チェックした値が監視対象になる閾値を超えてい (るのにまだ mdp が確保されていなけ) れば, 新しい methodDataOop オブジェクトを methodOop 内にセットする.
          (ただしこの処理は, TieredCompilation が無効 かつ ProfileInterpreter が有効な場合のみ実行される)
          -> InterpreterRuntime::profile_method()

実行回数が閾値を越えたメソッド (native method) の場合

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

      (1) チェックした値が JIT コンパイル対象になる閾値を超えていれば, CompilationPolicy オブジェクトを呼び出す
          -> InterpreterGenerator::generate_counter_overflow() が生成したコード
             -> (同上)

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

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

See: here for details

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

See: here for details

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

See: here for details

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

See: here for details

InterpreterRuntime::frequency_counter_overflow()

See: here for details

InterpreterRuntime::frequency_counter_overflow_inner()

See: here for details

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

See: here for details

InterpreterGenerator::generate_counter_incr() (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.