Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp

名前(function name)

void ParCompactionManager::follow_marking_stacks() {

本体部(body)

  {- -------------------------------------------
  (1) (以下の do...while ブロック内で, 
       ParCompactionManager が使用するスタック(marking_stack())内のポインタの処理を行う)
      ---------------------------------------- -}

      do {

    {- -------------------------------------------
  (1.1) まず, marking_stack 内に入っているポインタ全てに対して (overflow スタック内のものも含む)
        oopDesc::follow_contents() を適用する.

        なお, 処理する順番は overflow スタックが先. これは work stealing による負荷分散の機会を増やすため.
        (See: OverflowTaskQueue)
        ---------------------------------------- -}

        // Drain the overflow stack first, to allow stealing from the marking stack.
        oop obj;
        while (marking_stack()->pop_overflow(obj)) {
          obj->follow_contents(this);
        }
        while (marking_stack()->pop_local(obj)) {
          obj->follow_contents(this);
        }

    {- -------------------------------------------
  (1.1) 次に, _objarray_stack に入っているポインタ配列 (= 処理が途中までしか終わっていないポインタ配列) 全てに対して
        (なお, こちらも overflow スタック内のものも含む) 
        objArrayKlass::oop_follow_contents() を適用する.

        なお, 上述の通り, 処理する順番はやっぱり overflow スタックが先.
        ---------------------------------------- -}

        // Process ObjArrays one at a time to avoid marking stack bloat.
        ObjArrayTask task;
        if (_objarray_stack.pop_overflow(task)) {
          objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint();
          k->oop_follow_contents(this, task.obj(), task.index());
        } else if (_objarray_stack.pop_local(task)) {
          objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint();
          k->oop_follow_contents(this, task.obj(), task.index());
        }

    {- -------------------------------------------
  (1.1) 以上の処理を, 新しく見つかったポインタが増えなくなるまで再帰的に繰り返す.
        ---------------------------------------- -}

      } while (!marking_stacks_empty());

  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}

      assert(marking_stacks_empty(), "Sanity");
    }

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