Top


定義場所(file name)

hotspot/src/share/vm/runtime/compilationPolicy.cpp

名前(function name)

const char* StackWalkCompPolicy::shouldNotInline(methodHandle m) {

本体部(body)

  {- -------------------------------------------
  (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.