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