Up Top

JIT Compiler の処理 (1) : JIT コンパイルを開始する処理 : 実行回数が閾値を超えたことによる開始処理


概要(Summary)

「あるメソッドの呼び出された回数が閾値を越えた」場合, あるいは「あるループの実行された回数が閾値を越えた」場合は, その閾値を超えたコードに対して JIT コンパイルが開始される.

処理の流れは以下のようになる.

  1. 各メソッドの呼び出し時またはコード中の各ループの繰り返し時には, 対応づけられている InvocationCounter のカウンタ値をインクリメントする処理が行われる. カウンタ値が閾値を超えると, JIT コンパイル処理を行うかどうかを判断するために CompilationPolicy オブジェクトが呼び出される.

なお, InvocationCounter オブジェクトは methodOopDesc 及び methodDataOopDesc 内に格納されている. (See: here for details)

  1. CompilationPolicy オブジェクトによる判断は CompilationPolicy::event() で行われる.

なお, 実際には CompilationPolicy オブジェクトには4つのクラスが存在し, 対応するサブクラスがオーバーライドした関数で判断が行われる. (See: here, here, here and here for details)

以上の処理で CompilationPolicy オブジェクトが JIT コンパイルを行うべきと判断すれば, CompileBroker::compile_method() が呼び出されて JIT コンパイルが開始される. (See: here for details)

Subcategories


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