Top


定義場所(file name)

hotspot/src/share/vm/memory/genCollectedHeap.cpp

名前(function name)

void GenCollectedHeap::
gen_process_strong_roots(int level,
                         bool younger_gens_as_roots,
                         bool activate_scope,
                         bool collecting_perm_gen,
                         SharedHeap::ScanningOption so,
                         OopsInGenClosure* not_older_gens,
                         bool do_code_roots,
                         OopsInGenClosure* older_gens) {

本体部(body)

      // General strong roots.

  {- -------------------------------------------
  (1) 引数で指定された OopsInGenClosure を引数として SharedHeap::process_strong_roots() を呼び出し, 
      strong root から辿り着けるオブジェクト全てを処理する.

      (なお, do_code_roots 引数が true であれば, CodeCache の処理用として
      not_older_gens 引数の OopsInGenClosure をラッピングした CodeBlobToOopClosure が引き渡される)
      ---------------------------------------- -}

      if (!do_code_roots) {
        SharedHeap::process_strong_roots(activate_scope, collecting_perm_gen, so,
                                         not_older_gens, NULL, older_gens);
      } else {
        bool do_code_marking = (activate_scope || nmethod::oops_do_marking_is_active());
        CodeBlobToOopClosure code_roots(not_older_gens, /*do_marking=*/ do_code_marking);
        SharedHeap::process_strong_roots(activate_scope, collecting_perm_gen, so,
                                         not_older_gens, &code_roots, older_gens);
      }

  {- -------------------------------------------
  (1) younger_gens_as_roots 引数が true の場合は
      (= GC 対象の Generation よりも若い世代も全て root として扱う必要がある場合は), 
      Generation::oop_iterate() を呼んで
      それら若い世代内から GC 対象領域を指しているポインタ全てに対して 
      not_older_gens 引数で指定された OopsInGenClosure を適用する.
      ---------------------------------------- -}

      if (younger_gens_as_roots) {
        if (!_gen_process_strong_tasks->is_task_claimed(GCH_PS_younger_gens)) {
          for (int i = 0; i < level; i++) {
            not_older_gens->set_generation(_gens[i]);
            _gens[i]->oop_iterate(not_older_gens);
          }
          not_older_gens->reset_generation();
        }
      }

  {- -------------------------------------------
  (1) GC 対象の Generation よりも古い世代は全て root として扱う必要があるので, 
      CardTableRS::younger_refs_iterate() を呼んで
      それら古い世代内から GC 対象領域を指しているポインタ全てに対して 
      older_gens 引数で指定された OopsInGenClosure を適用する.
      ---------------------------------------- -}

      // When collection is parallel, all threads get to cooperate to do
      // older-gen scanning.
      for (int i = level+1; i < _n_gens; i++) {
        older_gens->set_generation(_gens[i]);
        rem_set()->younger_refs_iterate(_gens[i], older_gens);
        older_gens->reset_generation();
      }

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

      _gen_process_strong_tasks->all_tasks_completed();
    }

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