@@ -221,28 +221,38 @@ void ShenandoahRootScanner::roots_do(uint worker_id, OopClosure* oops, CLDClosur
assert (!ShenandoahSafepoint::is_at_shenandoah_safepoint () ||
!ShenandoahHeap::heap ()->unload_classes (),
" Expect class unloading when Shenandoah cycle is running" );
assert (clds != NULL , " Only possible with CLD closure" );
AlwaysTrueClosure always_true;
ShenandoahParallelOopsDoThreadClosure tc_cl (oops, code, tc);
ResourceMark rm;
// Process serial-claiming roots first
_serial_roots.oops_do (oops, worker_id);
// Process light-weight/limited parallel roots then
_vm_roots.oops_do (oops, worker_id);
_dedup_roots.oops_do (&always_true, oops, worker_id);
assert (clds != NULL , " Only possible with CLD closure " );
// Process heavy-weight/fully parallel roots the last
_cld_roots.cld_do (clds, worker_id);
ShenandoahParallelOopsDoThreadClosure tc_cl (oops, code, tc);
_thread_roots.threads_do (&tc_cl, worker_id);
AlwaysTrueClosure always_true;
_dedup_roots.oops_do (&always_true, oops, worker_id);
}
void ShenandoahRootScanner::strong_roots_do (uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc) {
assert (ShenandoahHeap::heap ()->unload_classes (), " Should be used during class unloading" );
ShenandoahParallelOopsDoThreadClosure tc_cl (oops, code, tc);
ResourceMark rm;
// Process serial-claiming roots first
_serial_roots.oops_do (oops, worker_id);
// Process light-weight/limited parallel roots then
_vm_roots.oops_do (oops, worker_id);
// Process heavy-weight/fully parallel roots the last
_cld_roots.always_strong_cld_do (clds, worker_id);
_thread_roots.threads_do (&tc_cl, worker_id);
}
@@ -272,14 +282,18 @@ void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) {
static_cast <CodeBlobToOopClosure*>(&blobsCl);
AlwaysTrueClosure always_true;
// Process serial-claiming roots first
_serial_roots.oops_do (oops, worker_id);
_serial_weak_roots.weak_oops_do (oops, worker_id);
// Process light-weight/limited parallel roots then
if (_stw_roots_processing) {
_vm_roots.oops_do <OopClosure>(oops, worker_id);
_weak_roots.oops_do <OopClosure>(oops, worker_id);
_dedup_roots.oops_do (&always_true, oops, worker_id);
}
// Process heavy-weight/fully parallel roots the last
if (_stw_class_unloading) {
CLDToOopClosure clds (oops, ClassLoaderData::_claim_strong);
_cld_roots.cld_do (&clds, worker_id);
@@ -324,16 +338,19 @@ void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
CLDToOopClosure adjust_cld_closure (oops, ClassLoaderData::_claim_strong);
AlwaysTrueClosure always_true;
// Process serial-claiming roots first
_serial_roots.oops_do (oops, worker_id);
_serial_weak_roots.weak_oops_do (oops, worker_id);
// Process light-weight/limited parallel roots then
_vm_roots.oops_do (oops, worker_id);
_weak_roots.oops_do <OopClosure>(oops, worker_id);
_dedup_roots.oops_do (&always_true, oops, worker_id);
_thread_roots. oops_do (oops, NULL , worker_id);
// Process heavy-weight/fully parallel roots the last
_cld_roots.cld_do (&adjust_cld_closure, worker_id);
_code_roots.code_blobs_do (adjust_code_closure, worker_id);
_serial_weak_roots.weak_oops_do (oops, worker_id);
_weak_roots.oops_do <OopClosure>(oops, worker_id);
_dedup_roots.oops_do (&always_true, oops, worker_id);
_thread_roots.oops_do (oops, NULL , worker_id);
}
ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner () :
@@ -354,15 +371,20 @@ ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner() :
MarkingCodeBlobClosure code (oops, !CodeBlobToOopClosure::FixRelocations);
ShenandoahParallelOopsDoThreadClosure tc_cl (oops, &code, NULL );
AlwaysTrueClosure always_true;
ResourceMark rm;
// Process serial-claiming roots first
_serial_roots.oops_do (oops, 0 );
_vm_roots.oops_do (oops, 0 );
_cld_roots.cld_do (&clds, 0 );
_thread_roots.threads_do (&tc_cl, 0 );
_code_roots.code_blobs_do (&code, 0 );
_serial_weak_roots.weak_oops_do (oops, 0 );
// Process light-weight/limited parallel roots then
_vm_roots.oops_do (oops, 0 );
_weak_roots.oops_do <OopClosure>(oops, 0 );
_dedup_roots.oops_do (&always_true, oops, 0 );
// Process heavy-weight/fully parallel roots the last
_cld_roots.cld_do (&clds, 0 );
_code_roots.code_blobs_do (&code, 0 );
_thread_roots.threads_do (&tc_cl, 0 );
}