< prev index next >

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

Print this page
rev 50076 : Fold Partial GC into Traversal GC

@@ -28,11 +28,10 @@
 #include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
 #include "gc/shenandoah/shenandoahFreeSet.hpp"
 #include "gc/shenandoah/shenandoahPhaseTimings.hpp"
 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
 #include "gc/shenandoah/shenandoahMonitoringSupport.hpp"
-#include "gc/shenandoah/shenandoahPartialGC.hpp"
 #include "gc/shenandoah/shenandoahTraversalGC.hpp"
 #include "gc/shenandoah/shenandoahUtils.hpp"
 #include "gc/shenandoah/shenandoahWorkerPolicy.hpp"
 #include "gc/shenandoah/vm_operations_shenandoah.hpp"
 #include "memory/iterator.hpp"

@@ -120,19 +119,19 @@
         mode = stw_full;
       }
       cause = _explicit_gc_cause;
     } else {
       // Potential normal cycle: ask heuristics if it wants to act
-      if (policy->should_start_partial_gc()) {
-        mode = concurrent_partial;
-        cause = GCCause::_shenandoah_partial_gc;
-      } else if (policy->should_start_traversal_gc()) {
+      ShenandoahHeap::GCCycleMode traversal_mode = policy->should_start_traversal_gc();
+      if (traversal_mode != ShenandoahHeap::NONE) {
         mode = concurrent_traversal;
         cause = GCCause::_shenandoah_traversal_gc;
+        heap->set_cycle_mode(traversal_mode);
       } else if (policy->should_start_normal_gc()) {
         mode = concurrent_normal;
         cause = GCCause::_shenandoah_concurrent_gc;
+        heap->set_cycle_mode(ShenandoahHeap::MAJOR);
       }
 
       // Ask policy if this cycle wants to process references or unload classes
       heap->set_process_references(policy->should_process_references());
       heap->set_unload_classes(policy->should_unload_classes());

@@ -156,13 +155,10 @@
     }
 
     switch (mode) {
       case none:
         break;
-      case concurrent_partial:
-        service_concurrent_partial_cycle(cause);
-        break;
       case concurrent_traversal:
         service_concurrent_traversal_cycle(cause);
         break;
       case concurrent_normal:
         service_concurrent_normal_cycle(cause);

@@ -175,10 +171,12 @@
         break;
       default:
         ShouldNotReachHere();
     }
 
+    heap->set_cycle_mode(ShenandoahHeap::NONE);
+
     if (gc_requested) {
       heap->set_used_at_last_gc();
 
       // If this was the explicit GC cycle, notify waiters about it
       if (explicit_gc_requested) {

@@ -240,55 +238,29 @@
   while (!should_terminate()) {
     os::naked_short_sleep(ShenandoahControlIntervalMin);
   }
 }
 
-void ShenandoahConcurrentThread::service_concurrent_partial_cycle(GCCause::Cause cause) {
-  ShenandoahHeap* heap = ShenandoahHeap::heap();
-  ShenandoahPartialGC* partial_gc = heap->partial_gc();
-
-  if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_outside_cycle)) return;
-
-  GCIdMark gc_id_mark;
-  ShenandoahGCSession session;
-
-  TraceCollectorStats tcs(heap->monitoring_support()->partial_collection_counters());
-
-  heap->vmop_entry_init_partial();
-  if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_partial)) return;
-
-  if (!partial_gc->has_work()) return;
-
-  heap->entry_partial();
-  if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_partial)) return;
-
-  heap->vmop_entry_final_partial();
-  if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_partial)) return;
-
-  heap->entry_cleanup();
-
-  heap->shenandoahPolicy()->record_success_partial();
-}
-
 void ShenandoahConcurrentThread::service_concurrent_traversal_cycle(GCCause::Cause cause) {
   GCIdMark gc_id_mark;
   ShenandoahGCSession session;
 
   ShenandoahHeap* heap = ShenandoahHeap::heap();
-  TraceCollectorStats tcs(heap->monitoring_support()->concurrent_collection_counters());
+  bool is_minor = heap->is_minor_gc();
+  TraceCollectorStats tcs(is_minor ? heap->monitoring_support()->partial_collection_counters()
+                                   : heap->monitoring_support()->concurrent_collection_counters());
 
   heap->vmop_entry_init_traversal();
 
   if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_traversal)) return;
 
   heap->entry_traversal();
-
   if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_traversal)) return;
 
   heap->vmop_entry_final_traversal();
 
-  heap->entry_cleanup_bitmaps();
+  heap->entry_cleanup_traversal();
 
   heap->shenandoahPolicy()->record_success_concurrent();
 }
 
 void ShenandoahConcurrentThread::service_concurrent_normal_cycle(GCCause::Cause cause) {
< prev index next >