Top


定義場所(file name)

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

説明(description)

// Consider m for compilation

名前(function name)

void StackWalkCompPolicy::method_invocation_event(methodHandle m, TRAPS) {

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      int hot_count = m->invocation_count();
      reset_counter_for_invocation_event(m);
      const char* comment = "count";

  {- -------------------------------------------
  (1) 以下の場合は, 以降の処理は省略する (= JIT コンパイル処理は行わない)
      * JIT コンパイル処理を行ってはいけない状況 (= CompilationPolicy::is_compilation_enabled() が false) の場合
      * (一足違いで先に?) 並行に動いている JIT コンパイラスレッドによって JIT コンパイルが完了されてしまった場合
      * 処理対象が, JIT コンパイルが禁止されているメソッドである場合 (= CompilationPolicy::can_be_compiled() が false)
      ---------------------------------------- -}

      if (is_compilation_enabled() && m->code() == NULL && can_be_compiled(m)) {

    {- -------------------------------------------
  (1.1) (変数宣言など)  &(assert)
        ---------------------------------------- -}

        ResourceMark rm(THREAD);
        JavaThread *thread = (JavaThread*)THREAD;
        frame       fr     = thread->last_frame();
        assert(fr.is_interpreted_frame(), "must be interpreted");
        assert(fr.interpreter_frame_method() == m(), "bad method");

    {- -------------------------------------------
  (1.1) (トレース出力)
        ---------------------------------------- -}

        if (TraceCompilationPolicy) {
          tty->print("method invocation trigger: ");
          m->print_short_name(tty);
          tty->print(" ( interpreted " INTPTR_FORMAT ", size=%d ) ", (address)m(), m->code_size());
        }

    {- -------------------------------------------
  (1.1) (変数宣言など)
        ---------------------------------------- -}

        RegisterMap reg_map(thread, false);
        javaVFrame* triggerVF = thread->last_java_vframe(&reg_map);
        // triggerVF is the frame that triggered its counter
        RFrame* first = new InterpretedRFrame(triggerVF->fr(), thread, m);

    {- -------------------------------------------
  (1.1) StackWalkCompPolicy::findTopInlinableFrame() を呼んで
        処理対象のメソッド(= インライン展開する範囲)を決め, 
        CompileBroker::compile_method() を呼んで, JIT コンパイル処理を行う.

        ただし, 以下の場合は JIT コンパイル処理は行わない.
        * (一足違いで先に?) 並行に動いている JIT コンパイラスレッドによって JIT コンパイルが完了されてしまった場合
        ---------------------------------------- -}

        if (first->top_method()->code() != NULL) {
          // called obsolete method/nmethod -- no need to recompile
          if (TraceCompilationPolicy) tty->print_cr(" --> " INTPTR_FORMAT, first->top_method()->code());
        } else {
          if (TimeCompilationPolicy) accumulated_time()->start();
          GrowableArray<RFrame*>* stack = new GrowableArray<RFrame*>(50);
          stack->push(first);
          RFrame* top = findTopInlinableFrame(stack);
          if (TimeCompilationPolicy) accumulated_time()->stop();
          assert(top != NULL, "findTopInlinableFrame returned null");
          if (TraceCompilationPolicy) top->print();
          CompileBroker::compile_method(top->top_method(), InvocationEntryBci, CompLevel_highest_tier,
                                        m, hot_count, comment, CHECK);
        }
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.