hotspot/src/share/vm/runtime/compilationPolicy.cpp
const char* StackWalkCompPolicy::shouldNotInline(methodHandle m) {
{- -------------------------------------------
(1) (この関数は, インライン展開してよいと判断した場合 NULL を返す.
ダメと判断した場合, ダメな理由を表す文字列を返す)
---------------------------------------- -}
// negative filter: should send NOT be inlined? returns NULL (--> inline) or rejection msg
{- -------------------------------------------
(1) 以下のどれかに当てはまる場合は, 非NULL の値をリターンする (= インライン展開してはダメ).
そうでなければ NULL をリターンする (= インライン展開してよい).
* 対象のメソッドが abstract method の場合
* 対象のメソッドが属しているクラスが未だ初期化されていない
* 対象のメソッドが native method の場合
* 対象のメソッドは既に JIT コンパイル済みで, その JIT 生成コードのサイズが InlineSmallCode を超えている
* 対象のメソッドのバイトコード数が MaxTrivialSize を超えていて (= 単純すぎるメソッドではなく), かつ
対象のメソッドが一度も実行されていない場合.
(ただし, 全てのメソッドを JIT コンパイルコードで実行する設定になっている場合 (= UseInterpreter が false の場合 = -Xcomp が指定されている場合) には,
実行回数の情報が存在しないのでこの条件は無視する)
* 対象のメソッドのバイトコード数が MaxTrivialSize を超えていて (= 単純すぎるメソッドではなく), かつ
対象のメソッドの実行回数が MinInliningThreshold よりも小さい場合 (あるいは CompileThreshold の半分よりも小さい場合)
(ただし, 全てのメソッドを JIT コンパイルコードで実行する設定になっている場合 (= UseInterpreter が false の場合 = -Xcomp が指定されている場合) には,
実行回数の情報が存在しないのでこの条件は無視する)
* 対象のメソッドのバイトコード数が MaxTrivialSize を超えていて (= 単純すぎるメソッドではなく), かつ
メソッドのシグネチャ(引数,返値,etc)に未だロードされていない(アンロードされた?#TODO)クラスが含まれる場合
---------------------------------------- -}
if (m->is_abstract()) return (_msg = "abstract method");
// note: we allow ik->is_abstract()
if (!instanceKlass::cast(m->method_holder())->is_initialized()) return (_msg = "method holder not initialized");
if (m->is_native()) return (_msg = "native method");
nmethod* m_code = m->code();
if (m_code != NULL && m_code->code_size() > InlineSmallCode)
return (_msg = "already compiled into a big method");
// use frequency-based objections only for non-trivial methods
if (m->code_size() <= MaxTrivialSize) return NULL;
if (UseInterpreter) { // don't use counts with -Xcomp
if ((m->code() == NULL) && m->was_never_executed()) return (_msg = "never executed");
if (!m->was_executed_more_than(MIN2(MinInliningThreshold, CompileThreshold >> 1))) return (_msg = "executed < MinInliningThreshold times");
}
if (methodOopDesc::has_unloaded_classes_in_signature(m, JavaThread::current())) return (_msg = "unloaded signature classes");
return NULL;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.