< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp

Print this page
rev 59484 : 8246100: Shenandoah: walk roots in more efficient order
Reviewed-by: XXX

*** 221,251 **** assert(!ShenandoahSafepoint::is_at_shenandoah_safepoint() || !ShenandoahHeap::heap()->unload_classes(), "Expect class unloading when Shenandoah cycle is running"); ResourceMark rm; - _serial_roots.oops_do(oops, worker_id); - _vm_roots.oops_do(oops, worker_id); - assert(clds != NULL, "Only possible with CLD closure"); - _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; _serial_roots.oops_do(oops, worker_id); - _vm_roots.oops_do(oops, worker_id); _cld_roots.always_strong_cld_do(clds, worker_id); _thread_roots.threads_do(&tc_cl, worker_id); } ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase, --- 221,259 ---- assert(!ShenandoahSafepoint::is_at_shenandoah_safepoint() || !ShenandoahHeap::heap()->unload_classes(), "Expect class unloading when Shenandoah cycle is running"); ResourceMark rm; assert(clds != NULL, "Only possible with CLD closure"); ! // Process serial-claiming roots first ! _serial_roots.oops_do(oops, worker_id); ! _cld_roots.cld_do(clds, worker_id); + // Process light-weight parallel roots then + _vm_roots.oops_do(oops, worker_id); AlwaysTrueClosure always_true; _dedup_roots.oops_do(&always_true, oops, worker_id); + + // Process heavy-weight parallel roots the last + ShenandoahParallelOopsDoThreadClosure tc_cl(oops, code, tc); + _thread_roots.threads_do(&tc_cl, 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); _cld_roots.always_strong_cld_do(clds, worker_id); + + // Process light-weight parallel roots then + _vm_roots.oops_do(oops, worker_id); + + // Process heavy-weight parallel roots the last _thread_roots.threads_do(&tc_cl, worker_id); } ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase,
*** 270,290 **** CodeBlobToOopClosure* codes_cl = ShenandoahConcurrentRoots::can_do_concurrent_class_unloading() ? static_cast<CodeBlobToOopClosure*>(&blobs_and_disarm_Cl) : static_cast<CodeBlobToOopClosure*>(&blobsCl); AlwaysTrueClosure always_true; _serial_roots.oops_do(oops, worker_id); _serial_weak_roots.weak_oops_do(oops, worker_id); 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); } if (_stw_class_unloading) { - CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); - _cld_roots.cld_do(&clds, worker_id); _code_roots.code_blobs_do(codes_cl, worker_id); _thread_roots.oops_do(oops, NULL, worker_id); } else { _thread_roots.oops_do(oops, codes_cl, worker_id); } --- 278,304 ---- CodeBlobToOopClosure* codes_cl = ShenandoahConcurrentRoots::can_do_concurrent_class_unloading() ? static_cast<CodeBlobToOopClosure*>(&blobs_and_disarm_Cl) : 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); + if (_stw_class_unloading) { + CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); + _cld_roots.cld_do(&clds, worker_id); + } + + // Process light-weight 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 parallel roots the last if (_stw_class_unloading) { _code_roots.code_blobs_do(codes_cl, worker_id); _thread_roots.oops_do(oops, NULL, worker_id); } else { _thread_roots.oops_do(oops, codes_cl, worker_id); }
*** 322,341 **** static_cast<CodeBlobToOopClosure*>(&blobs_and_disarm_Cl) : static_cast<CodeBlobToOopClosure*>(&code_blob_cl); CLDToOopClosure adjust_cld_closure(oops, ClassLoaderData::_claim_strong); AlwaysTrueClosure always_true; _serial_roots.oops_do(oops, worker_id); ! _vm_roots.oops_do(oops, worker_id); ! ! _thread_roots.oops_do(oops, NULL, worker_id); _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); } ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner() : ShenandoahRootProcessor(ShenandoahPhaseTimings::heap_iteration_roots), _serial_roots(ShenandoahPhaseTimings::heap_iteration_roots), --- 336,358 ---- static_cast<CodeBlobToOopClosure*>(&blobs_and_disarm_Cl) : static_cast<CodeBlobToOopClosure*>(&code_blob_cl); 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); _cld_roots.cld_do(&adjust_cld_closure, worker_id); ! // Process light-weight 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); + + // Process heavy-weight parallel roots the last + _code_roots.code_blobs_do(adjust_code_closure, worker_id); + _thread_roots.oops_do(oops, NULL, worker_id); } ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner() : ShenandoahRootProcessor(ShenandoahPhaseTimings::heap_iteration_roots), _serial_roots(ShenandoahPhaseTimings::heap_iteration_roots),
*** 354,368 **** MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations); ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL); AlwaysTrueClosure always_true; ResourceMark rm; _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); _weak_roots.oops_do<OopClosure>(oops, 0); _dedup_roots.oops_do(&always_true, oops, 0); } --- 371,389 ---- 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); ! _serial_weak_roots.weak_oops_do(oops, 0); _cld_roots.cld_do(&clds, 0); ! // Process light-weight 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 parallel roots the last + _code_roots.code_blobs_do(&code, 0); + _thread_roots.threads_do(&tc_cl, 0); }
< prev index next >