hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp
void RefProcTaskExecutor::execute(ProcessTask& task)
{
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
ParallelScavengeHeap* heap = PSParallelCompact::gc_heap();
uint parallel_gc_threads = heap->gc_task_manager()->workers();
RegionTaskQueueSet* qset = ParCompactionManager::region_array();
ParallelTaskTerminator terminator(parallel_gc_threads, qset);
{- -------------------------------------------
(1) GCTaskQueue::create() で GCTaskQueue を作り,
そこに ParallelGCThreads 個分だけ RefProcTaskProxy をつめる.
---------------------------------------- -}
GCTaskQueue* q = GCTaskQueue::create();
for(uint i=0; i<parallel_gc_threads; i++) {
q->enqueue(new RefProcTaskProxy(task, i));
}
{- -------------------------------------------
(1) さらに, ParallelGCThreads 個分だけ StealMarkingTask を追加.
---------------------------------------- -}
if (task.marks_oops_alive()) {
if (parallel_gc_threads>1) {
for (uint j=0; j<parallel_gc_threads; j++) {
q->enqueue(new StealMarkingTask(&terminator));
}
}
}
{- -------------------------------------------
(1) GCTaskManager::execute_and_wait() で, GCTaskThread 達に実行させる.
---------------------------------------- -}
PSParallelCompact::gc_task_manager()->execute_and_wait(q);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.