hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp
nmethod* SimpleThresholdPolicy::event(methodHandle method, methodHandle inlinee,
int branch_bci, int bci, CompLevel comp_level, TRAPS) {
{- -------------------------------------------
(1) もし現在対象のメソッドを Interprefere で実行している状態であり (= comp_level が CompLevel_none), かつ
JVMTI の処理のために interp_only_mode になっている場合,
計測処理(& CompilerBroker の呼び出し)は行わずに, ここでリターン (返値は NULL).
(See: [here](no3059eFS.html) for details)
---------------------------------------- -}
if (comp_level == CompLevel_none &&
JvmtiExport::can_post_interpreter_events()) {
assert(THREAD->is_Java_thread(), "Should be java thread");
if (((JavaThread*)THREAD)->is_interp_only_mode()) {
return NULL;
}
}
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
nmethod *osr_nm = NULL;
{- -------------------------------------------
(1) SimpleThresholdPolicy::handle_counter_overflow() を呼び出し,
処理対象の methodOop (および methodDataOop) 内の InvocationCounter の中に
カウンタ値が閾値を超えているものがあれば, キャリービットを立てておく.
(引数で指定された method と inlinee の両方とも処理しておく)
---------------------------------------- -}
handle_counter_overflow(method());
if (method() != inlinee()) {
handle_counter_overflow(inlinee());
}
{- -------------------------------------------
(1) (トレース出力)
---------------------------------------- -}
if (PrintTieredEvents) {
print_event(bci == InvocationEntryBci ? CALL : LOOP, method, inlinee, bci, comp_level);
}
{- -------------------------------------------
(1) 以下の処理は, 対象の位置がメソッドの先頭か backward branch かに応じて 2通りに分岐.
---------------------------------------- -}
{- -------------------------------------------
(1) メソッドの先頭の場合 (= メソッド全体を JIT コンパイルする場合),
SimpleThresholdPolicy::method_invocation_event() を呼び出して JIT コンパイル処理を行い,
NULL をリターンする.
---------------------------------------- -}
if (bci == InvocationEntryBci) {
method_invocation_event(method, inlinee, comp_level, THREAD);
{- -------------------------------------------
(1) backward branch の場合 (= OnStackReplacement の場合),
SimpleThresholdPolicy::method_back_branch_event() を呼び出して JIT コンパイル処理を行い,
以下のどちらかをリターンする
* JIT コンパイルが完了している可能性があれば,
methodOopDesc::lookup_osr_nmethod_for() でコンパイル結果の取得を試み, 結果をリターンする.
* そうでなければ,
NULL をリターンする.
---------------------------------------- -}
} else {
method_back_branch_event(method, inlinee, bci, comp_level, THREAD);
int highest_level = method->highest_osr_comp_level();
if (highest_level > comp_level) {
osr_nm = method->lookup_osr_nmethod_for(bci, highest_level, false);
}
}
return osr_nm;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.