diff --git a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp
index 6524a781c8b..2bcb1398bca 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp
@@ -723,23 +723,33 @@ void ShenandoahControlThread::service_concurrent_cycle(ShenandoahHeap* heap,
   }
   const char* msg;
   if (heap->mode()->is_generational()) {
-    if (heap->cancelled_gc()) {
-      msg = (generation->is_young()) ? "At end of Interrupted Concurrent Young GC" :
-                                       "At end of Interrupted Concurrent Bootstrap GC";
-    } else {
-      msg = (generation->is_young()) ? "At end of Concurrent Young GC" :
-                                       "At end of Concurrent Bootstrap GC";
-      // We only record GC results if GC was successful
-      ShenandoahMmuTracker* mmu_tracker = heap->mmu_tracker();
-      if (generation->is_young()) {
+    ShenandoahMmuTracker* mmu_tracker = heap->mmu_tracker();
+    if (generation->is_young()) {
+      if (heap->cancelled_gc()) {
+        msg = (do_old_gc_bootstrap) ? "At end of Interrupted Concurrent Bootstrap GC":
+                                      "At end of Interrupted Concurrent Young GC";
+      } else {
+        // We only record GC results if GC was successful
+        msg = (do_old_gc_bootstrap) ? "At end of Concurrent Bootstrap GC":
+                                      "At end of Concurrent Young GC";
         if (heap->collection_set()->has_old_regions()) {
           bool mixed_is_done = (heap->old_heuristics()->unprocessed_old_collection_candidates() == 0);
           mmu_tracker->record_mixed(generation, get_gc_id(), mixed_is_done);
+        } else if (do_old_gc_bootstrap) {
+          mmu_tracker->record_bootstrap(generation, get_gc_id(), heap->collection_set()->has_old_regions());
         } else {
           mmu_tracker->record_young(generation, get_gc_id());
         }
+      }
+    } else {
+      assert(generation->is_global(), "If not young, must be GLOBAL");
+      assert(!do_old_gc_bootstrap, "Do not bootstrap with GLOBAL GC");
+      if (heap->cancelled_gc()) {
+        msg = "At end of Interrupted Concurrent GLOBAL GC";
       } else {
-        mmu_tracker->record_bootstrap(generation, get_gc_id(), heap->collection_set()->has_old_regions());
+        // We only record GC results if GC was successful
+        msg = "At end of Concurrent Global GC";
+        mmu_tracker->record_global(generation, get_gc_id());
       }
     }
   } else {
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp
index 99349073ca5..783135faad0 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp
@@ -57,10 +57,10 @@ bool ShenandoahDegenGC::collect(GCCause::Cause cause) {
   vmop_degenerated();
   ShenandoahHeap* heap = ShenandoahHeap::heap();
   if (heap->mode()->is_generational()) {
-    bool is_bootstrap_gc = heap->is_concurrent_old_mark_in_progress() && _generation->is_young();
+    bool is_bootstrap_gc = heap->old_generation()->state() == ShenandoahOldGeneration::BOOTSTRAPPING;
     heap->mmu_tracker()->record_degenerated(_generation, GCId::current(), is_bootstrap_gc,
                                             !heap->collection_set()->has_old_regions());
-    const char* msg = is_bootstrap_gc? "At end of Degenerated Boostrap Old GC": "At end of Degenerated GC";
+    const char* msg = is_bootstrap_gc? "At end of Degenerated Bootstrap Old GC": "At end of Degenerated Young GC";
     heap->log_heap_status(msg);
   }
   return true;
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMmuTracker.cpp b/src/hotspot/share/gc/shenandoah/shenandoahMmuTracker.cpp
index a7688679f29..d5fe561ff8a 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahMmuTracker.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahMmuTracker.cpp
@@ -113,9 +113,13 @@ void ShenandoahMmuTracker::record_young(ShenandoahGeneration* generation, size_t
   update_utilization(generation, gcid, "Concurrent Young GC");
 }
 
+void ShenandoahMmuTracker::record_global(ShenandoahGeneration* generation, size_t gcid) {
+  update_utilization(generation, gcid, "Concurrent Global GC");
+}
+
 void ShenandoahMmuTracker::record_bootstrap(ShenandoahGeneration* generation, size_t gcid, bool candidates_for_mixed) {
   // Not likely that this will represent an "ideal" GCU, but doesn't hurt to try
-  update_utilization(generation, gcid, "Bootstrap Old GC");
+  update_utilization(generation, gcid, "Concurrent Bootstrap GC");
 }
 
 void ShenandoahMmuTracker::record_old_marking_increment(ShenandoahGeneration* generation, size_t gcid, bool old_marking_done,
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMmuTracker.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMmuTracker.hpp
index 6ab7d180245..117e322f893 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahMmuTracker.hpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahMmuTracker.hpp
@@ -91,6 +91,7 @@ class ShenandoahMmuTracker {
   // both record_full() and record_degenerated() with the same value of gcid.  record_full() is called first and the log
   // reports such a cycle as a FULL cycle.
   void record_young(ShenandoahGeneration* generation, size_t gcid);
+  void record_global(ShenandoahGeneration* generation, size_t gcid);
   void record_bootstrap(ShenandoahGeneration* generation, size_t gcid, bool has_old_candidates);
   void record_old_marking_increment(ShenandoahGeneration* generation, size_t gcid, bool old_marking_done, bool has_old_candidates);
   void record_mixed(ShenandoahGeneration* generation, size_t gcid, bool is_mixed_done);