Template Interpreter の場合, メソッドの呼び出し回数のチェックは以下の箇所で行われる.
ネイティブメソッドではない場合:
InterpreterGenerator::generate_normal_entry() が生成したコード (See: here for details)
ネイティブメソッドの場合:
InterpreterGenerator::generate_native_entry() が生成したコード (See: here for details)
アーキテクチャ(sparc, x86)によって若干処理に違いはあるが, どちらも InterpreterGenerator::generate_counter_incr() が生成したコードでカウンタ値をチェックし, 閾値を超えていれば InterpreterGenerator::generate_counter_overflow() が生成したコードが InterpreterRuntime::frequency_counter_overflow() を呼び出す. これにより CompilationPolicy オブジェクトが呼び出され, JIT コンパイル処理が開始される.
(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()
(See: here for details) -> InterpreterGenerator::generate_native_entry() が生成したコード -> (1) JIT コンパイラを使う場合は, invocation counter 値を増加させて値をチェックする -> InterpreterGenerator::generate_counter_incr() が生成したコード -> (同上) (1) チェックした値が JIT コンパイル対象になる閾値を超えていれば, CompilationPolicy オブジェクトを呼び出す -> InterpreterGenerator::generate_counter_overflow() が生成したコード -> (同上)
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.