8386204: GenShen: Bootstrap cycles are misidentified in logs

This commit is contained in:
Patrick Fontanilla 2026-06-09 22:55:18 +00:00
parent 7f62474fcb
commit b667c2c080
4 changed files with 15 additions and 7 deletions

View File

@ -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));
}

View File

@ -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:

View File

@ -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()) {

View File

@ -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();