diff --git a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp index b2d578c599d..21de01c5850 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp @@ -45,19 +45,19 @@ #include "runtime/vmThread.hpp" #include "utilities/events.hpp" -ShenandoahDegenGC::ShenandoahDegenGC(ShenandoahDegenPoint degen_point, ShenandoahGeneration* generation) : +ShenandoahDegenGC::ShenandoahDegenGC(ShenandoahDegenPoint degen_point, ShenandoahGeneration* generation, bool do_old_gc_bootstrap) : ShenandoahGC(generation), _degen_point(degen_point), - _abbreviated(false) { + _abbreviated(false), + _do_old_gc_bootstrap(do_old_gc_bootstrap) { } bool ShenandoahDegenGC::collect(GCCause::Cause cause) { vmop_degenerated(); ShenandoahHeap* heap = ShenandoahHeap::heap(); if (heap->mode()->is_generational()) { - bool is_bootstrap_gc = heap->young_generation()->is_bootstrap_cycle(); FormatBuffer<32> buf("Degenerated %s GC", _generation->name()); - const char* msg = is_bootstrap_gc ? "Degenerated Bootstrap Old GC" : buf.buffer(); + const char* msg = _do_old_gc_bootstrap ? "Degenerated Bootstrap Old GC" : buf.buffer(); heap->mmu_tracker()->record_degenerated(GCId::current(), msg); heap->log_heap_status(FormatBuffer<64>("At end of %s", msg)); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.hpp b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.hpp index 34b9688106c..f3d033af128 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.hpp @@ -35,9 +35,10 @@ class ShenandoahDegenGC : public ShenandoahGC { private: const ShenandoahDegenPoint _degen_point; bool _abbreviated; + const bool _do_old_gc_bootstrap; public: - ShenandoahDegenGC(ShenandoahDegenPoint degen_point, ShenandoahGeneration* generation); + ShenandoahDegenGC(ShenandoahDegenPoint degen_point, ShenandoahGeneration* generation, bool do_old_gc_bootstrap = false); bool collect(GCCause::Cause cause) override; private: diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp index f522a33a31c..e456366be5d 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp @@ -53,7 +53,8 @@ ShenandoahGenerationalControlThread::ShenandoahGenerationalControlThread() : _requested_generation(nullptr), _gc_mode(none), _degen_point(ShenandoahGC::_degenerated_unset), - _heap(ShenandoahGenerationalHeap::heap()) { + _heap(ShenandoahGenerationalHeap::heap()), + _do_old_gc_bootstrap(false) { shenandoah_assert_generational(); set_name("ShenControl"); create_and_start(); @@ -529,12 +530,14 @@ void ShenandoahGenerationalControlThread::service_concurrent_cycle(ShenandoahGen assert(!generation->is_old(), "Old GC takes a different control path"); + _do_old_gc_bootstrap = do_old_gc_bootstrap; ShenandoahConcurrentGC gc(generation, do_old_gc_bootstrap); _heap->increment_total_collections(false); if (gc.collect(cause)) { // Cycle is complete _heap->notify_gc_progress(); generation->record_success_concurrent(gc.abbreviated()); + _do_old_gc_bootstrap = false; } else { assert(_heap->cancelled_gc(), "Must have been cancelled"); check_cancellation_or_degen(gc.degen_point()); @@ -613,9 +616,10 @@ void ShenandoahGenerationalControlThread::service_stw_degenerated_cycle(const Sh ShenandoahGCSession session(request.cause, request.generation, true, _degen_point == ShenandoahGC::ShenandoahDegenPoint::_degenerated_outside_cycle); - ShenandoahDegenGC gc(_degen_point, request.generation); + ShenandoahDegenGC gc(_degen_point, request.generation, _do_old_gc_bootstrap); gc.collect(request.cause); _degen_point = ShenandoahGC::_degenerated_unset; + _do_old_gc_bootstrap = false; assert(_heap->young_generation()->task_queues()->is_empty(), "Unexpected young generation marking tasks"); if (request.generation->is_global()) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.hpp index 5a3ab25eabe..358299ea469 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.hpp @@ -84,6 +84,9 @@ private: // preparing for mark). ShenandoahSharedFlag _allow_old_preemption; + // True while the current cycle is the bootstrap of an old GC. + bool _do_old_gc_bootstrap; + public: ShenandoahGenerationalControlThread();