< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp
Print this page
rev 57866 : 8246100: Shenandoah: walk roots in more efficient order
Reviewed-by: zgu
*** 224,256 ****
template <typename ITR>
void ShenandoahRootScanner<ITR>::roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure *tc) {
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);
}
template <typename ITR>
void ShenandoahRootScanner<ITR>::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);
}
template <typename IsAlive, typename KeepAlive>
--- 224,265 ----
template <typename ITR>
void ShenandoahRootScanner<ITR>::roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure *tc) {
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);
! // Process heavy-weight/fully parallel roots the last
_cld_roots.cld_do(clds, worker_id);
_thread_roots.threads_do(&tc_cl, worker_id);
}
template <typename ITR>
void ShenandoahRootScanner<ITR>::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);
}
template <typename IsAlive, typename KeepAlive>
*** 261,278 ****
static_cast<CodeBlobToOopClosure*>(&blobs_and_disarm_Cl) :
static_cast<CodeBlobToOopClosure*>(&update_blobs);
CLDToOopClosure clds(keep_alive, ClassLoaderData::_claim_strong);
_serial_roots.oops_do(keep_alive, worker_id);
_vm_roots.oops_do(keep_alive, worker_id);
_cld_roots.cld_do(&clds, worker_id);
_code_roots.code_blobs_do(codes_cl, worker_id);
_thread_roots.oops_do(keep_alive, NULL, worker_id);
- _serial_weak_roots.weak_oops_do(is_alive, keep_alive, worker_id);
- _weak_roots.weak_oops_do(is_alive, keep_alive, worker_id);
- _dedup_roots.oops_do(is_alive, keep_alive, worker_id);
}
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_INLINE_HPP
--- 270,291 ----
static_cast<CodeBlobToOopClosure*>(&blobs_and_disarm_Cl) :
static_cast<CodeBlobToOopClosure*>(&update_blobs);
CLDToOopClosure clds(keep_alive, ClassLoaderData::_claim_strong);
+ // Process serial-claiming roots first
_serial_roots.oops_do(keep_alive, worker_id);
+ _serial_weak_roots.weak_oops_do(is_alive, keep_alive, worker_id);
+
+ // Process light-weight/limited parallel roots then
_vm_roots.oops_do(keep_alive, worker_id);
+ _weak_roots.weak_oops_do(is_alive, keep_alive, worker_id);
+ _dedup_roots.oops_do(is_alive, keep_alive, worker_id);
+ // Process heavy-weight/fully parallel roots the last
_cld_roots.cld_do(&clds, worker_id);
_code_roots.code_blobs_do(codes_cl, worker_id);
_thread_roots.oops_do(keep_alive, NULL, worker_id);
}
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_INLINE_HPP
< prev index next >