hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp
void StealMarkingTask::do_it(GCTaskManager* manager, uint which) {
{- -------------------------------------------
(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.