hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp
// Determine if a method should be compiled with a normal entry point at a different level.
CompLevel SimpleThresholdPolicy::call_event(methodOop method, CompLevel cur_level) {
{- -------------------------------------------
(1) SimpleThresholdPolicy::common() を呼び出し, その結果をリターンする.
(predicate には SimpleThresholdPolicy::call_predicate() を使用)
ただし, 対象のメソッド用に生成された OSR コードの中に
SimpleThresholdPolicy::common() の結果よりも高い JIT コンパイルレベルのものが既に存在している場合,
メソッド呼び出しの度に OSR コードに遷移することになり効率がよくない.
そのため, この場合は OSR コードの中で最も高い JIT コンパイルレベルに合わせた結果をリターンする.
具体的には, 以下の値をリターンする.
* OSR の中で最高のレベルが CompLevel_full_optimization であり,
SimpleThresholdPolicy::common() の結果が CompLevel_full_profile の場合:
-> methodDataOop への記録が一度でも行われていれば (= 既に CompLevel_full_profile になっていたのなら),
CompLevel_full_optimization をリターンする.
そうでなければ, 今回は CompLevel_full_profile をリターンする.
* それ以外の場合:
-> OSR コードの中で最高の JIT コンパイルレベルをリターンする.
---------------------------------------- -}
CompLevel osr_level = (CompLevel) method->highest_osr_comp_level();
CompLevel next_level = common(&SimpleThresholdPolicy::call_predicate, method, cur_level);
// If OSR method level is greater than the regular method level, the levels should be
// equalized by raising the regular method level in order to avoid OSRs during each
// invocation of the method.
if (osr_level == CompLevel_full_optimization && cur_level == CompLevel_full_profile) {
methodDataOop mdo = method->method_data();
guarantee(mdo != NULL, "MDO should not be NULL");
if (mdo->invocation_count() >= 1) {
next_level = CompLevel_full_optimization;
}
} else {
next_level = MAX2(osr_level, next_level);
}
return next_level;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.