< 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 >