Top


定義場所(file name)

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

説明(description)

// Common transition function. Given a predicate determines if a method should transition to another level.

名前(function name)

CompLevel SimpleThresholdPolicy::common(Predicate p, methodOop method, CompLevel cur_level) {

本体部(body)

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