Top


定義場所(file name)

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

名前(function name)

nmethod* SimpleThresholdPolicy::event(methodHandle method, methodHandle inlinee,
                                      int branch_bci, int bci, CompLevel comp_level, TRAPS) {

本体部(body)

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