hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp
void ParCompactionManager::follow_marking_stacks() {
{- -------------------------------------------
(1) (以下の do...while ブロック内で,
ParCompactionManager が使用するスタック(marking_stack())内のポインタの処理を行う)
---------------------------------------- -}
do {
{- -------------------------------------------
(1.1) まず, marking_stack 内に入っているポインタ全てに対して (overflow スタック内のものも含む)
oopDesc::follow_contents() を適用する.
なお, 処理する順番は overflow スタックが先. これは work stealing による負荷分散の機会を増やすため.
(See: OverflowTaskQueue)
---------------------------------------- -}
// Drain the overflow stack first, to allow stealing from the marking stack.
oop obj;
while (marking_stack()->pop_overflow(obj)) {
obj->follow_contents(this);
}
while (marking_stack()->pop_local(obj)) {
obj->follow_contents(this);
}
{- -------------------------------------------
(1.1) 次に, _objarray_stack に入っているポインタ配列 (= 処理が途中までしか終わっていないポインタ配列) 全てに対して
(なお, こちらも overflow スタック内のものも含む)
objArrayKlass::oop_follow_contents() を適用する.
なお, 上述の通り, 処理する順番はやっぱり overflow スタックが先.
---------------------------------------- -}
// Process ObjArrays one at a time to avoid marking stack bloat.
ObjArrayTask task;
if (_objarray_stack.pop_overflow(task)) {
objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint();
k->oop_follow_contents(this, task.obj(), task.index());
} else if (_objarray_stack.pop_local(task)) {
objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint();
k->oop_follow_contents(this, task.obj(), task.index());
}
{- -------------------------------------------
(1.1) 以上の処理を, 新しく見つかったポインタが増えなくなるまで再帰的に繰り返す.
---------------------------------------- -}
} while (!marking_stacks_empty());
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(marking_stacks_empty(), "Sanity");
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.