diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp index 9424a804bd8..8fc2c7c9941 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp @@ -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; diff --git a/src/hotspot/share/gc/g1/g1FullCollector.cpp b/src/hotspot/share/gc/g1/g1FullCollector.cpp index 06db5f612a1..b6388c2f722 100644 --- a/src/hotspot/share/gc/g1/g1FullCollector.cpp +++ b/src/hotspot/share/gc/g1/g1FullCollector.cpp @@ -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()), diff --git a/src/hotspot/share/gc/g1/g1FullCollector.hpp b/src/hotspot/share/gc/g1/g1FullCollector.hpp index 7e455b07013..605556a2ba6 100644 --- a/src/hotspot/share/gc/g1/g1FullCollector.hpp +++ b/src/hotspot/share/gc/g1/g1FullCollector.hpp @@ -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(); diff --git a/src/hotspot/share/gc/g1/g1FullGCScope.cpp b/src/hotspot/share/gc/g1/g1FullGCScope.cpp index 083b77b44b7..cb4ebe423ff 100644 --- a/src/hotspot/share/gc/g1/g1FullGCScope.cpp +++ b/src/hotspot/share/gc/g1/g1FullGCScope.cpp @@ -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; } diff --git a/src/hotspot/share/gc/g1/g1FullGCScope.hpp b/src/hotspot/share/gc/g1/g1FullGCScope.hpp index 278a00cedbd..fc9d5a71f92 100644 --- a/src/hotspot/share/gc/g1/g1FullGCScope.hpp +++ b/src/hotspot/share/gc/g1/g1FullGCScope.hpp @@ -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; };