Top


定義場所(file name)

hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp

説明(description)

// Determine if a method should be compiled with a normal entry point at a different level.

名前(function name)

CompLevel SimpleThresholdPolicy::call_event(methodOop method,  CompLevel cur_level) {

本体部(body)

  {- -------------------------------------------
  (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.