< prev index next >

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

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

@@ -177,27 +177,30 @@
   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);
+
+  // 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);
     _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);
   }
-
-  _dedup_roots.oops_do(&always_true, oops, worker_id);
 }
 
 ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
   ShenandoahRootProcessor(phase),
   _serial_roots(phase),

@@ -230,20 +233,23 @@
                                               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);
+
+  // 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() :
    ShenandoahRootProcessor(ShenandoahPhaseTimings::heap_iteration_roots),
    _serial_roots(ShenandoahPhaseTimings::heap_iteration_roots),

@@ -261,17 +267,22 @@
    // Must use _claim_none to avoid interfering with concurrent CLDG iteration
    CLDToOopClosure clds(oops, ClassLoaderData::_claim_none);
    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);
  }
< prev index next >