18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26
27 #include "jfr/jfrEvents.hpp"
28 #include "gc/shared/gcCause.hpp"
29 #include "gc/shared/gcTrace.hpp"
30 #include "gc/shared/gcWhen.hpp"
31 #include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
32 #include "gc/shenandoah/shenandoahMarkCompact.hpp"
33 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
34 #include "gc/shenandoah/shenandoahHeuristics.hpp"
35 #include "gc/shenandoah/shenandoahUtils.hpp"
36 #include "utilities/debug.hpp"
37
38 ShenandoahPhaseTimings::Phase ShenandoahGCPhase::_current_phase = ShenandoahPhaseTimings::_invalid_phase;
39
40 ShenandoahGCSession::ShenandoahGCSession(GCCause::Cause cause) :
41 _heap(ShenandoahHeap::heap()),
42 _timer(_heap->gc_timer()),
43 _tracer(_heap->tracer()) {
44 assert(!ShenandoahGCPhase::is_current_phase_valid(), "No current GC phase");
45
46 _heap->set_gc_cause(cause);
47 _timer->register_gc_start();
48 _tracer->report_gc_start(cause, _timer->gc_start());
49 _heap->trace_heap_before_gc(_tracer);
50
51 _heap->shenandoah_policy()->record_cycle_start();
52 _heap->heuristics()->record_cycle_start();
53 _trace_cycle.initialize(_heap->cycle_memory_manager(), cause,
54 /* allMemoryPoolsAffected */ true,
55 /* recordGCBeginTime = */ true,
56 /* recordPreGCUsage = */ true,
57 /* recordPeakUsage = */ true,
58 /* recordPostGCUsage = */ true,
68 _heap->trace_heap_after_gc(_tracer);
69 _tracer->report_gc_end(_timer->gc_end(), _timer->time_partitions());
70 assert(!ShenandoahGCPhase::is_current_phase_valid(), "No current GC phase");
71 _heap->set_gc_cause(GCCause::_no_gc);
72 }
73
74 ShenandoahGCPauseMark::ShenandoahGCPauseMark(uint gc_id, SvcGCMarker::reason_type type) :
75 _heap(ShenandoahHeap::heap()), _gc_id_mark(gc_id), _svc_gc_mark(type), _is_gc_active_mark() {
76 _trace_pause.initialize(_heap->stw_memory_manager(), _heap->gc_cause(),
77 /* allMemoryPoolsAffected */ true,
78 /* recordGCBeginTime = */ true,
79 /* recordPreGCUsage = */ false,
80 /* recordPeakUsage = */ false,
81 /* recordPostGCUsage = */ false,
82 /* recordAccumulatedGCTime = */ true,
83 /* recordGCEndTime = */ true,
84 /* countCollection = */ true
85 );
86 }
87
88 ShenandoahPausePhase::ShenandoahPausePhase(const char* title, bool log_heap_usage) :
89 _tracer(title, NULL, GCCause::_no_gc, log_heap_usage),
90 _timer(ShenandoahHeap::heap()->gc_timer()) {
91 _timer->register_gc_pause_start(title);
92 }
93
94 ShenandoahPausePhase::~ShenandoahPausePhase() {
95 _timer->register_gc_pause_end();
96 }
97
98 ShenandoahConcurrentPhase::ShenandoahConcurrentPhase(const char* title, bool log_heap_usage) :
99 _tracer(title, NULL, GCCause::_no_gc, log_heap_usage),
100 _timer(ShenandoahHeap::heap()->gc_timer()) {
101 _timer->register_gc_concurrent_start(title);
102 }
103
104 ShenandoahConcurrentPhase::~ShenandoahConcurrentPhase() {
105 _timer->register_gc_concurrent_end();
106 }
107
108 ShenandoahGCPhase::ShenandoahGCPhase(ShenandoahPhaseTimings::Phase phase) :
109 _timings(ShenandoahHeap::heap()->phase_timings()), _phase(phase) {
110 assert(!Thread::current()->is_Worker_thread() &&
111 (Thread::current()->is_VM_thread() ||
112 Thread::current()->is_ConcurrentGC_thread()),
113 "Must be set by these threads");
114 _parent_phase = _current_phase;
115 _current_phase = phase;
116 _start = os::elapsedTime();
117 }
118
119 ShenandoahGCPhase::~ShenandoahGCPhase() {
120 _timings->record_phase_time(_phase, os::elapsedTime() - _start);
121 _current_phase = _parent_phase;
122 }
123
124 bool ShenandoahGCPhase::is_current_phase_valid() {
125 return _current_phase < ShenandoahPhaseTimings::_num_phases;
126 }
127
128 ShenandoahGCSubPhase::ShenandoahGCSubPhase(ShenandoahPhaseTimings::Phase phase) :
129 ShenandoahGCPhase(phase),
130 _timer(ShenandoahHeap::heap()->gc_timer()) {
131 _timer->register_gc_phase_start(ShenandoahPhaseTimings::phase_name(phase), Ticks::now());
132 }
133
134 ShenandoahGCSubPhase::~ShenandoahGCSubPhase() {
135 _timer->register_gc_phase_end(Ticks::now());
136 }
137
138 ShenandoahGCWorkerPhase::ShenandoahGCWorkerPhase(const ShenandoahPhaseTimings::Phase phase) :
139 _timings(ShenandoahHeap::heap()->phase_timings()), _phase(phase) {
140 _timings->record_workers_start(_phase);
141 }
142
143 ShenandoahGCWorkerPhase::~ShenandoahGCWorkerPhase() {
144 _timings->record_workers_end(_phase);
145 }
146
147 ShenandoahWorkerSession::ShenandoahWorkerSession(uint worker_id) : _worker_id(worker_id) {
148 Thread* thr = Thread::current();
149 assert(ShenandoahThreadLocalData::worker_id(thr) == ShenandoahThreadLocalData::INVALID_WORKER_ID, "Already set");
150 ShenandoahThreadLocalData::set_worker_id(thr, worker_id);
151 }
152
153 ShenandoahConcurrentWorkerSession::~ShenandoahConcurrentWorkerSession() {
154 _event.commit(GCId::current(), ShenandoahPhaseTimings::phase_name(ShenandoahGCPhase::current_phase()));
|
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26
27 #include "jfr/jfrEvents.hpp"
28 #include "gc/shared/gcCause.hpp"
29 #include "gc/shared/gcTrace.hpp"
30 #include "gc/shared/gcWhen.hpp"
31 #include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
32 #include "gc/shenandoah/shenandoahMarkCompact.hpp"
33 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
34 #include "gc/shenandoah/shenandoahHeuristics.hpp"
35 #include "gc/shenandoah/shenandoahUtils.hpp"
36 #include "utilities/debug.hpp"
37
38 ShenandoahPhaseTimings::Phase ShenandoahTimingsTracker::_current_phase = ShenandoahPhaseTimings::_invalid_phase;
39
40 ShenandoahGCSession::ShenandoahGCSession(GCCause::Cause cause) :
41 _heap(ShenandoahHeap::heap()),
42 _timer(_heap->gc_timer()),
43 _tracer(_heap->tracer()) {
44 assert(!ShenandoahGCPhase::is_current_phase_valid(), "No current GC phase");
45
46 _heap->set_gc_cause(cause);
47 _timer->register_gc_start();
48 _tracer->report_gc_start(cause, _timer->gc_start());
49 _heap->trace_heap_before_gc(_tracer);
50
51 _heap->shenandoah_policy()->record_cycle_start();
52 _heap->heuristics()->record_cycle_start();
53 _trace_cycle.initialize(_heap->cycle_memory_manager(), cause,
54 /* allMemoryPoolsAffected */ true,
55 /* recordGCBeginTime = */ true,
56 /* recordPreGCUsage = */ true,
57 /* recordPeakUsage = */ true,
58 /* recordPostGCUsage = */ true,
68 _heap->trace_heap_after_gc(_tracer);
69 _tracer->report_gc_end(_timer->gc_end(), _timer->time_partitions());
70 assert(!ShenandoahGCPhase::is_current_phase_valid(), "No current GC phase");
71 _heap->set_gc_cause(GCCause::_no_gc);
72 }
73
74 ShenandoahGCPauseMark::ShenandoahGCPauseMark(uint gc_id, SvcGCMarker::reason_type type) :
75 _heap(ShenandoahHeap::heap()), _gc_id_mark(gc_id), _svc_gc_mark(type), _is_gc_active_mark() {
76 _trace_pause.initialize(_heap->stw_memory_manager(), _heap->gc_cause(),
77 /* allMemoryPoolsAffected */ true,
78 /* recordGCBeginTime = */ true,
79 /* recordPreGCUsage = */ false,
80 /* recordPeakUsage = */ false,
81 /* recordPostGCUsage = */ false,
82 /* recordAccumulatedGCTime = */ true,
83 /* recordGCEndTime = */ true,
84 /* countCollection = */ true
85 );
86 }
87
88 ShenandoahPausePhase::ShenandoahPausePhase(const char* title, ShenandoahPhaseTimings::Phase phase, bool log_heap_usage) :
89 ShenandoahTimingsTracker(phase),
90 _tracer(title, NULL, GCCause::_no_gc, log_heap_usage),
91 _timer(ShenandoahHeap::heap()->gc_timer()) {
92 _timer->register_gc_pause_start(title);
93 }
94
95 ShenandoahPausePhase::~ShenandoahPausePhase() {
96 _timer->register_gc_pause_end();
97 }
98
99 ShenandoahConcurrentPhase::ShenandoahConcurrentPhase(const char* title, ShenandoahPhaseTimings::Phase phase, bool log_heap_usage) :
100 ShenandoahTimingsTracker(phase),
101 _tracer(title, NULL, GCCause::_no_gc, log_heap_usage),
102 _timer(ShenandoahHeap::heap()->gc_timer()) {
103 _timer->register_gc_concurrent_start(title);
104 }
105
106 ShenandoahConcurrentPhase::~ShenandoahConcurrentPhase() {
107 _timer->register_gc_concurrent_end();
108 }
109
110 ShenandoahTimingsTracker::ShenandoahTimingsTracker(ShenandoahPhaseTimings::Phase phase) :
111 _timings(ShenandoahHeap::heap()->phase_timings()), _phase(phase) {
112 assert(!Thread::current()->is_Worker_thread() &&
113 (Thread::current()->is_VM_thread() ||
114 Thread::current()->is_ConcurrentGC_thread()),
115 "Must be set by these threads");
116 _parent_phase = _current_phase;
117 _current_phase = phase;
118 _start = os::elapsedTime();
119 }
120
121 ShenandoahTimingsTracker::~ShenandoahTimingsTracker() {
122 _timings->record_phase_time(_phase, os::elapsedTime() - _start);
123 _current_phase = _parent_phase;
124 }
125
126 bool ShenandoahTimingsTracker::is_current_phase_valid() {
127 return _current_phase < ShenandoahPhaseTimings::_num_phases;
128 }
129
130 ShenandoahGCPhase::ShenandoahGCPhase(ShenandoahPhaseTimings::Phase phase) :
131 ShenandoahTimingsTracker(phase),
132 _timer(ShenandoahHeap::heap()->gc_timer()) {
133 _timer->register_gc_phase_start(ShenandoahPhaseTimings::phase_name(phase), Ticks::now());
134 }
135
136 ShenandoahGCPhase::~ShenandoahGCPhase() {
137 _timer->register_gc_phase_end(Ticks::now());
138 }
139
140 ShenandoahGCWorkerPhase::ShenandoahGCWorkerPhase(const ShenandoahPhaseTimings::Phase phase) :
141 _timings(ShenandoahHeap::heap()->phase_timings()), _phase(phase) {
142 _timings->record_workers_start(_phase);
143 }
144
145 ShenandoahGCWorkerPhase::~ShenandoahGCWorkerPhase() {
146 _timings->record_workers_end(_phase);
147 }
148
149 ShenandoahWorkerSession::ShenandoahWorkerSession(uint worker_id) : _worker_id(worker_id) {
150 Thread* thr = Thread::current();
151 assert(ShenandoahThreadLocalData::worker_id(thr) == ShenandoahThreadLocalData::INVALID_WORKER_ID, "Already set");
152 ShenandoahThreadLocalData::set_worker_id(thr, worker_id);
153 }
154
155 ShenandoahConcurrentWorkerSession::~ShenandoahConcurrentWorkerSession() {
156 _event.commit(GCId::current(), ShenandoahPhaseTimings::phase_name(ShenandoahGCPhase::current_phase()));
|