hotspot/src/share/vm/runtime/compilationPolicy.cpp
// Consider m for compilation
void StackWalkCompPolicy::method_invocation_event(methodHandle m, TRAPS) {
{- -------------------------------------------
(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(®_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.