hotspot/src/share/vm/memory/genCollectedHeap.cpp
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) {
// 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.