< prev index next >
src/share/vm/gc_implementation/shenandoah/shenandoahUtils.cpp
Print this page
rev 10498 : [backport] Move heuristics from ShCollectorPolicy to ShHeap
rev 10546 : [backport] Wrap worker id in thread local worker session
rev 10612 : [backport] Wiring GC events to JFR + Restore heap occupancy in GC logs after JFR changes
rev 10615 : [backport] Wiring heap and metaspace info to JFR
*** 25,44 ****
#include "gc_implementation/shenandoah/shenandoahAllocTracker.hpp"
#include "gc_implementation/shenandoah/shenandoahCollectorPolicy.hpp"
#include "gc_implementation/shenandoah/shenandoahMarkCompact.hpp"
#include "gc_implementation/shenandoah/shenandoahHeap.hpp"
#include "gc_implementation/shenandoah/shenandoahUtils.hpp"
#include "gc_implementation/shenandoah/shenandoahLogging.hpp"
#include "gc_implementation/shared/gcTimer.hpp"
! ShenandoahGCSession::ShenandoahGCSession() {
ShenandoahHeap* sh = ShenandoahHeap::heap();
! _timer = sh->gc_timer();
_timer->register_gc_start();
sh->shenandoahPolicy()->record_cycle_start();
_trace_cycle.initialize(false, sh->gc_cause(),
/* recordGCBeginTime = */ true,
/* recordPreGCUsage = */ true,
/* recordPeakUsage = */ true,
/* recordPostGCUsage = */ true,
--- 25,54 ----
#include "gc_implementation/shenandoah/shenandoahAllocTracker.hpp"
#include "gc_implementation/shenandoah/shenandoahCollectorPolicy.hpp"
#include "gc_implementation/shenandoah/shenandoahMarkCompact.hpp"
#include "gc_implementation/shenandoah/shenandoahHeap.hpp"
+ #include "gc_implementation/shenandoah/shenandoahHeuristics.hpp"
#include "gc_implementation/shenandoah/shenandoahUtils.hpp"
#include "gc_implementation/shenandoah/shenandoahLogging.hpp"
+ #include "gc_interface/gcCause.hpp"
#include "gc_implementation/shared/gcTimer.hpp"
+ #include "gc_implementation/shared/gcWhen.hpp"
+ #include "gc_implementation/shared/gcTrace.hpp"
! ShenandoahGCSession::ShenandoahGCSession(GCCause::Cause cause) :
! _timer(ShenandoahHeap::heap()->gc_timer()),
! _tracer(ShenandoahHeap::heap()->tracer()) {
ShenandoahHeap* sh = ShenandoahHeap::heap();
!
_timer->register_gc_start();
+ _tracer->report_gc_start(cause, _timer->gc_start());
+ sh->trace_heap(GCWhen::BeforeGC, _tracer);
+
sh->shenandoahPolicy()->record_cycle_start();
+ sh->heuristics()->record_cycle_start();
_trace_cycle.initialize(false, sh->gc_cause(),
/* recordGCBeginTime = */ true,
/* recordPreGCUsage = */ true,
/* recordPeakUsage = */ true,
/* recordPostGCUsage = */ true,
*** 47,79 ****
/* countCollection = */ true
);
}
ShenandoahGCSession::~ShenandoahGCSession() {
! ShenandoahHeap::heap()->shenandoahPolicy()->record_cycle_end();
_timer->register_gc_end();
}
ShenandoahGCPauseMark::ShenandoahGCPauseMark(SvcGCMarker::reason_type type) :
_svc_gc_mark(type), _is_gc_active_mark() {
ShenandoahHeap* sh = ShenandoahHeap::heap();
- sh->shenandoahPolicy()->record_gc_start();
_trace_pause.initialize(true, sh->gc_cause(),
/* recordGCBeginTime = */ true,
/* recordPreGCUsage = */ false,
/* recordPeakUsage = */ false,
/* recordPostGCUsage = */ false,
/* recordAccumulatedGCTime = */ true,
/* recordGCEndTime = */ true,
/* countCollection = */ true
);
}
ShenandoahGCPauseMark::~ShenandoahGCPauseMark() {
ShenandoahHeap* sh = ShenandoahHeap::heap();
! sh->shenandoahPolicy()->record_gc_end();
}
ShenandoahGCPhase::ShenandoahGCPhase(const ShenandoahPhaseTimings::Phase phase) :
_phase(phase) {
ShenandoahHeap::heap()->phase_timings()->record_phase_start(_phase);
--- 57,95 ----
/* countCollection = */ true
);
}
ShenandoahGCSession::~ShenandoahGCSession() {
! ShenandoahHeap::heap()->heuristics()->record_cycle_end();
! _tracer->report_gc_end(_timer->gc_end(), _timer->time_partitions());
_timer->register_gc_end();
}
ShenandoahGCPauseMark::ShenandoahGCPauseMark(SvcGCMarker::reason_type type) :
_svc_gc_mark(type), _is_gc_active_mark() {
ShenandoahHeap* sh = ShenandoahHeap::heap();
+ // FIXME: It seems that JMC throws away level 0 events, which are the Shenandoah
+ // pause events. Create this pseudo level 0 event to push real events to level 1.
+ sh->gc_timer()->register_gc_phase_start("Shenandoah", Ticks::now());
_trace_pause.initialize(true, sh->gc_cause(),
/* recordGCBeginTime = */ true,
/* recordPreGCUsage = */ false,
/* recordPeakUsage = */ false,
/* recordPostGCUsage = */ false,
/* recordAccumulatedGCTime = */ true,
/* recordGCEndTime = */ true,
/* countCollection = */ true
);
+
+ sh->heuristics()->record_gc_start();
}
ShenandoahGCPauseMark::~ShenandoahGCPauseMark() {
ShenandoahHeap* sh = ShenandoahHeap::heap();
! sh->gc_timer()->register_gc_phase_end(Ticks::now());
! sh->heuristics()->record_gc_end();
}
ShenandoahGCPhase::ShenandoahGCPhase(const ShenandoahPhaseTimings::Phase phase) :
_phase(phase) {
ShenandoahHeap::heap()->phase_timings()->record_phase_start(_phase);
*** 107,111 ****
--- 123,142 ----
log_warning(gc)("Allocation stall: %.0f us (threshold: " INTX_FORMAT " us)",
duration_us, ShenandoahAllocationStallThreshold);
}
}
}
+
+ ShenandoahWorkerSession::ShenandoahWorkerSession(uint worker_id) {
+ Thread* thr = Thread::current();
+ assert(thr->worker_id() == INVALID_WORKER_ID, "Already set");
+ thr->set_worker_id(worker_id);
+ }
+
+ ShenandoahWorkerSession::~ShenandoahWorkerSession() {
+ #ifdef ASSERT
+ Thread* thr = Thread::current();
+ assert(thr->worker_id() != INVALID_WORKER_ID, "Must be set");
+ thr->set_worker_id(INVALID_WORKER_ID);
+ #endif
+ }
+
< prev index next >