Up Top

JIT Compiler の処理 (2) : JIT コンパイラを呼び出す処理


概要(Summary)

JIT コンパイルの開始処理からは, 最終的に CompileBroker::compile_method() が呼び出される (この関数が JIT コンパイル処理のエントリポイント) (See: here for details).

CompileBroker::compile_method() では, ネイティブメソッドかどうかで処理が 2通りに分かれる.

備考(Notes)

なお, CompilerThread は, それぞれの JIT コンパイルレベル用(C1 用, C2 用) に複数個生成されている (See: here for details). これらはそれぞれ, 対応するレベル用の CompileQueue を監視している. コンパイル要求を伝える際には, 望みのレベルのキューに要求を入れることで, 適切な CompilerThread に通知している.

処理の流れ (概要)(Execution Flows : Summary)

CompileBroker::compile_method() での処理

CompileBroker::compile_method()
-> * 対象がネイティブメソッドの場合:
     -> AdapterHandlerLibrary::create_native_wrapper()
        -> (See: here for details)
   * 対象がネイティブメソッドではない場合:
     -> CompileBroker::compile_method_base()
        -> (1) コンパイル要求をキューに詰めて CompilerThread に通知する.
               -> CompileBroker::create_compile_task()
                  -> CompileQueue::add()
                     -> methodOopDesc::set_queued_for_compilation()
                     -> Monitor::notify_all()                        <= CompilerThread に通知        
           (1) ("-Xbatch" コマンドラインオプション等が付いている場合は) JIT コンパイル処理が終わるまで待つ
               -> CompileBroker::wait_for_completion()  

通知された CompilerThread スレッド側の処理

(See: here for details)
-> CompileBroker::compiler_thread_loop()
   -> (1) キューから新しいコンパイル要求を取得する (キューになければ届くまで待つ)
          -> CompileQueue::get()
             -> Monitor::wait()                          <= CompileTask が届くまで待機
             -> CompilationPolicy::select_task() (を各サブクラスがオーバーライドしたもの)
             -> CompileQueue::remove()
      (1) JIT コンパイルを実行する
          -> CompileBroker::invoke_compiler_on_method()
             -> (1) 適切なコンパイラオブジェクト (AbstractCompilerのサブクラスのインスタンス) を取得する
                    -> CompileBroker::compiler()
                (1) 取得したコンパイラオブジェクトを用いて JIT コンパイル処理を行う.
                    -> AbstractCompiler::compile_method() (を各サブクラスがオーバーライドしたもの)
                       -> (See: here for details)

処理の流れ (詳細)(Execution Flows : Details)

CompileBroker::compile_method()

See: here for details

CompileBroker::compile_method_base()

See: here for details

CompileBroker::compilation_is_in_queue()

See: here for details

methodOopDesc::queued_for_compilation()

See: here for details

CompileBroker::create_compile_task()

See: here for details

CompileQueue::add()

See: here for details

methodOopDesc::set_queued_for_compilation()

See: here for details

CompileBroker::compiler_thread_loop()

See: here for details

CompileQueue::get()

See: here for details

NonTieredCompPolicy::select_task()

See: here for details

SimpleThresholdPolicy::select_task()

See: here for details

AdvancedThresholdPolicy::select_task()

(#Under Construction)

CompileBroker::invoke_compiler_on_method()

See: here for details

CompileBroker::compiler()

See: here for details

is_c2_compile()

See: here for details

is_c1_compile()

See: here for details


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