Top


定義場所(file name)

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

名前(function name)

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

本体部(body)

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

      assert(_gen != NULL, "Sanity");
      assert(_gen->object_space()->contains(_gen_top) || _gen_top == _gen->object_space()->top(), "Sanity");
      assert(_stripe_number < ParallelGCThreads, "Sanity");

      {

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

        PSPromotionManager* pm = PSPromotionManager::gc_thread_promotion_manager(which);

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

        assert(Universe::heap()->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");

  {- -------------------------------------------
  (1) Old 領域からのポインタを調べるために, 
      CardTableExtension::scavenge_contents_parallel() を呼び出して
      remembered set(CardTableExtension) 内で dirty/younger_gen である箇所を調べ
      該当するアドレス範囲内のオブジェクト中にあるポインタを 
      PSPromotionManager 内のタスクキューに追加する.

      (誰か assert を追加してくれ, みたいなことが書いてあったりするが...)
      ---------------------------------------- -}

        CardTableExtension* card_table = (CardTableExtension *)Universe::heap()->barrier_set();
        // FIX ME! Assert that card_table is the type we believe it to be.

        card_table->scavenge_contents_parallel(_gen->start_array(),
                                               _gen->object_space(),
                                               _gen_top,
                                               pm,
                                               _stripe_number);

  {- -------------------------------------------
  (1) PSPromotionManager::drain_stacks() で, 
      タスクキューに追加したポインタに対して, 再帰的な Scavenge 処理を行う.
      ---------------------------------------- -}

        // Do the real work
        pm->drain_stacks(false);
      }
    }

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