JIT コンパイルの開始処理からは, 最終的に CompileBroker::compile_method() が呼び出される (この関数が JIT コンパイル処理のエントリポイント) (See: here for details).
CompileBroker::compile_method() では, ネイティブメソッドかどうかで処理が 2通りに分かれる.
ネイティブメソッドの場合には, AdapterHandlerLibrary::create_native_wrapper() を呼び出すことで JIT コンパイルを実行する(See: here for details).
ネイティブメソッドではない場合, JIT コンパイル作業は専用のスレッド(CompilerThread)で行われる.
この場合, CompileBroker::compile_method() は, CompileQueue 経由で CompilerThread にコンパイル要求(CompileTask オブジェクト)を通知する.
CompilerThread は, CompileBroker::compiler_thread_loop() 内の無限ループ (while true ループ) で CompileTask が来るのを待っており, 要求が来ると JIT コンパイル処理を開始する.
実際の JIT コンパイル処理は, CompilerThread が AbstractCompiler::compile_method() (を各サブクラスがオーバーライドしたもの) を呼び出すことで実行される (See: here for details).
なお, CompilerThread は, それぞれの JIT コンパイルレベル用(C1 用, C2 用) に複数個生成されている (See: here for details). これらはそれぞれ, 対応するレベル用の CompileQueue を監視している. コンパイル要求を伝える際には, 望みのレベルのキューに要求を入れることで, 適切な CompilerThread に通知している.
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()
(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)
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction)
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.