hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp
// Common transition function. Given a predicate determines if a method should transition to another level.
CompLevel SimpleThresholdPolicy::common(Predicate p, methodOop method, CompLevel cur_level) {
{- -------------------------------------------
(1) もし対象のメソッドが非常にシンプルであれば (= SimpleThresholdPolicy::is_trivial() が true),
C1 でも十分なので, CompLevel_simple をリターン.
---------------------------------------- -}
if (is_trivial(method)) return CompLevel_simple;
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
CompLevel next_level = cur_level;
int i = method->invocation_count();
int b = method->backedge_count();
{- -------------------------------------------
(1) 現状での InvocationCounter の値(i, b), cur_level 引数の値(= 現在の JIT コンパイルレベル), 及び
p 引数の predicate に基づき, 以下の値をリターン.
* cur_level が CompLevel_none (= インタープリタ実行中) の場合:
* 「現時点でもし CompLevel_full_profile であれば,
CompLevel_full_optimization にしてよいだけの条件が揃っている」場合
-> CompLevel_full_optimization をリターン.
(処理としては, この関数自身を CompLevel_full_profile で再帰呼び出しして判定)
* 上の条件には当てはまらないが, p 引数の predicate が true と判定した場合:
-> CompLevel_full_profile をリターン.
* 以上のどちらでもない場合
-> cur_level をリターン (= JIT コンパイルレベルは現状のままで十分)
* cur_level が CompLevel_limited_profile もしくは CompLevel_full_profile の場合:
* methodDataOop が付いており, かつプロファイリングを取るべきメソッド(would_profile())であり,
かつ p 引数の predicate が (methodDataOop 内の InvocationCounter のカウンタ値に対して) true を返した場合:
-> CompLevel_full_optimization をリターン.
* methodDataOop が付いており, かつプロファイリングを取るべきメソッド(would_profile())だが,
p 引数の predicate が (methodDataOop 内の InvocationCounter のカウンタ値に対して) false を返した場合:
-> cur_level をリターン (= JIT コンパイルレベルは現状のままで十分)
* methodDataOop が付いているが, プロファイリングを取るべきメソッド(would_profile())ではない場合:
-> CompLevel_full_optimization をリターン.
* methodDataOop が付いてない場合
-> cur_level をリターン (= JIT コンパイルレベルは現状のままで十分)
---------------------------------------- -}
switch(cur_level) {
case CompLevel_none:
// If we were at full profile level, would we switch to full opt?
if (common(p, method, CompLevel_full_profile) == CompLevel_full_optimization) {
next_level = CompLevel_full_optimization;
} else if ((this->*p)(i, b, cur_level)) {
next_level = CompLevel_full_profile;
}
break;
case CompLevel_limited_profile:
case CompLevel_full_profile:
{
methodDataOop mdo = method->method_data();
if (mdo != NULL) {
if (mdo->would_profile()) {
int mdo_i = mdo->invocation_count_delta();
int mdo_b = mdo->backedge_count_delta();
if ((this->*p)(mdo_i, mdo_b, cur_level)) {
next_level = CompLevel_full_optimization;
}
} else {
next_level = CompLevel_full_optimization;
}
}
}
break;
}
return next_level;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.