8377165: G1: Introduce common G1 GC Mark to collect scoped objects

Reviewed-by: iwalulya, ayang
This commit is contained in:
Thomas Schatzl 2026-02-09 09:44:28 +00:00
parent ee5b10c7f0
commit a7bf468a8f
5 changed files with 31 additions and 39 deletions

View File

@ -138,6 +138,26 @@ void G1RegionMappingChangedListener::on_commit(uint start_idx, size_t num_region
reset_from_card_cache(start_idx, num_regions);
}
// Collects commonly used scoped objects that are related to initial setup.
class G1GCMark : StackObj {
ResourceMark _rm;
IsSTWGCActiveMark _active_gc_mark;
GCIdMark _gc_id_mark;
SvcGCMarker _sgcm;
GCTraceCPUTime _tcpu;
public:
G1GCMark(GCTracer* tracer, bool is_full_gc) :
_rm(),
_active_gc_mark(),
_gc_id_mark(),
_sgcm(is_full_gc ? SvcGCMarker::FULL : SvcGCMarker::MINOR),
_tcpu(tracer) {
assert_at_safepoint_on_vm_thread();
}
};
void G1CollectedHeap::run_batch_task(G1BatchedTask* cl) {
uint num_workers = MAX2(1u, MIN2(cl->num_workers_estimate(), workers()->active_workers()));
cl->set_max_workers(num_workers);
@ -914,12 +934,11 @@ void G1CollectedHeap::verify_after_full_collection() {
void G1CollectedHeap::do_full_collection(size_t allocation_word_size,
bool clear_all_soft_refs,
bool do_maximal_compaction) {
assert_at_safepoint_on_vm_thread();
G1FullGCMark gc_mark;
G1FullGCTracer tracer;
G1GCMark gc_mark(&tracer, true /* is_full_gc */);
GCTraceTime(Info, gc) tm("Pause Full", nullptr, gc_cause(), true);
G1FullCollector collector(this, clear_all_soft_refs, do_maximal_compaction, gc_mark.tracer());
G1FullCollector collector(this, clear_all_soft_refs, do_maximal_compaction, &tracer);
collector.prepare_collection();
collector.collect();
collector.complete_collection(allocation_word_size);
@ -2714,16 +2733,7 @@ void G1CollectedHeap::flush_region_pin_cache() {
}
void G1CollectedHeap::do_collection_pause_at_safepoint(size_t allocation_word_size) {
assert_at_safepoint_on_vm_thread();
assert(!is_stw_gc_active(), "collection is not reentrant");
ResourceMark rm;
IsSTWGCActiveMark active_gc_mark;
GCIdMark gc_id_mark;
SvcGCMarker sgcm(SvcGCMarker::MINOR);
GCTraceCPUTime tcpu(_gc_tracer_stw);
G1GCMark gcm(_gc_tracer_stw, false /* is_full_gc */);
_bytes_used_during_gc = 0;

View File

@ -110,7 +110,7 @@ uint G1FullCollector::calc_active_workers() {
G1FullCollector::G1FullCollector(G1CollectedHeap* heap,
bool clear_soft_refs,
bool do_maximal_compaction,
G1FullGCTracer* tracer) :
GCTracer* tracer) :
_heap(heap),
_scope(heap->monitoring_support(), clear_soft_refs, do_maximal_compaction, tracer),
_num_workers(calc_active_workers()),

View File

@ -58,18 +58,6 @@ public:
}
};
// Full GC Mark that holds GC id and CPU time trace. Needs to be separate
// from the G1FullCollector and G1FullGCScope to allow the Full GC logging
// to have the same structure as the Young GC logging.
class G1FullGCMark : StackObj {
GCIdMark _gc_id;
G1FullGCTracer _tracer;
GCTraceCPUTime _cpu_time;
public:
G1FullGCMark() : _gc_id(), _tracer(), _cpu_time(&_tracer) { }
G1FullGCTracer* tracer() { return &_tracer; }
};
// The G1FullCollector holds data associated with the current Full GC.
class G1FullCollector : StackObj {
G1CollectedHeap* _heap;
@ -102,7 +90,7 @@ public:
G1FullCollector(G1CollectedHeap* heap,
bool clear_soft_refs,
bool do_maximal_compaction,
G1FullGCTracer* tracer);
GCTracer* tracer);
~G1FullCollector();
void prepare_collection();

View File

@ -38,14 +38,11 @@ G1FullGCJFRTracerMark::~G1FullGCJFRTracerMark() {
G1FullGCScope::G1FullGCScope(G1MonitoringSupport* monitoring_support,
bool clear_soft,
bool do_maximal_compaction,
G1FullGCTracer* tracer) :
_rm(),
GCTracer* tracer) :
_should_clear_soft_refs(clear_soft),
_do_maximal_compaction(do_maximal_compaction),
_svc_marker(SvcGCMarker::FULL),
_timer(),
_tracer(tracer),
_active(),
_tracer_mark(&_timer, _tracer),
_monitoring_scope(monitoring_support),
_heap_printer(G1CollectedHeap::heap()),
@ -57,7 +54,7 @@ STWGCTimer* G1FullGCScope::timer() {
return &_timer;
}
G1FullGCTracer* G1FullGCScope::tracer() {
GCTracer* G1FullGCScope::tracer() {
return _tracer;
}

View File

@ -46,13 +46,10 @@ public:
// Class used to group scoped objects used in the Full GC together.
class G1FullGCScope : public StackObj {
ResourceMark _rm;
bool _should_clear_soft_refs;
bool _do_maximal_compaction;
SvcGCMarker _svc_marker;
STWGCTimer _timer;
G1FullGCTracer* _tracer;
IsSTWGCActiveMark _active;
GCTracer* _tracer;
G1FullGCJFRTracerMark _tracer_mark;
G1FullGCMonitoringScope _monitoring_scope;
G1HeapPrinterMark _heap_printer;
@ -62,13 +59,13 @@ public:
G1FullGCScope(G1MonitoringSupport* monitoring_support,
bool clear_soft,
bool do_maximal_compaction,
G1FullGCTracer* tracer);
GCTracer* tracer);
bool should_clear_soft_refs() const { return _should_clear_soft_refs; }
bool do_maximal_compaction() { return _do_maximal_compaction; }
STWGCTimer* timer();
G1FullGCTracer* tracer();
GCTracer* tracer();
size_t region_compaction_threshold() const;
};