Top


定義場所(file name)

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

名前(function name)

void StealMarkingTask::do_it(GCTaskManager* manager, uint which) {

本体部(body)

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

      assert(Universe::heap()->is_gc_active(), "called outside gc");

  {- -------------------------------------------
  (1) (トレース出力)
      ---------------------------------------- -}

      NOT_PRODUCT(TraceTime tm("StealMarkingTask",
        PrintGCDetails && TraceParallelOldGCTasks, true, gclog_or_tty));

  {- -------------------------------------------
  (1) ParCompactionManager::gc_thread_compaction_manager() で, 
      これを実行している GCTaskThread 用の ParCompactionManager オブジェクトを取得する.
      ---------------------------------------- -}

      ParCompactionManager* cm =
        ParCompactionManager::gc_thread_compaction_manager(which);

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);

      oop obj = NULL;
      ObjArrayTask task;
      int random_seed = 17;

  {- -------------------------------------------
  (1) まず, ParCompactionManager::steal_objarray() で, 他スレッドの _objarray_stack から仕事を奪うことを試みる.
      成功したら, 奪ってきたポインタ配列に対して objArrayKlass::oop_follow_contents() で mark 処理を行い, 
      さらにそこからの参照先に対しても ParCompactionManager::follow_marking_stacks() で再帰的に処理を行う.

      ParCompactionManager::steal_objarray() が成功しなかった場合は, 
      次に, ParCompactionManager::steal() で, 他スレッドの _marking_stack から仕事を奪うことを試みる.
      成功したら, 奪ってきたポインタに対して oopDesc::follow_contents() で mark 処理を行い, 
      さらにそこからの参照先に対しても ParCompactionManager::follow_marking_stacks() で再帰的に処理を行う.

      (このループが終了する条件は, 
       ParCompactionManager::steal_objarray() や ParCompactionManager::steal() による work stealing が失敗し, 
       さらに ParallelTaskTerminator::offer_termination() が true を返した場合.)
      ---------------------------------------- -}

      do {
        while (ParCompactionManager::steal_objarray(which, &random_seed, task)) {
          objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint();
          k->oop_follow_contents(cm, task.obj(), task.index());
          cm->follow_marking_stacks();
        }
        while (ParCompactionManager::steal(which, &random_seed, obj)) {
          obj->follow_contents(cm);
          cm->follow_marking_stacks();
        }
      } while (!terminator()->offer_termination());
    }

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