Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp
38920 views
1
/*
2
* Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
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
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
26
#define SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
27
28
#include "memory/allocation.hpp"
29
30
class LineBuffer;
31
32
template <class T> class WorkerDataArray;
33
34
class G1GCPhaseTimes : public CHeapObj<mtGC> {
35
friend class G1GCParPhasePrinter;
36
37
uint _active_gc_threads;
38
uint _max_gc_threads;
39
40
public:
41
enum GCParPhases {
42
GCWorkerStart,
43
ExtRootScan,
44
ThreadRoots,
45
StringTableRoots,
46
UniverseRoots,
47
JNIRoots,
48
ObjectSynchronizerRoots,
49
FlatProfilerRoots,
50
ManagementRoots,
51
SystemDictionaryRoots,
52
CLDGRoots,
53
JVMTIRoots,
54
CodeCacheRoots,
55
CMRefRoots,
56
WaitForStrongCLD,
57
WeakCLDRoots,
58
SATBFiltering,
59
UpdateRS,
60
ScanRS,
61
CodeRoots,
62
ObjCopy,
63
Termination,
64
Other,
65
GCWorkerTotal,
66
GCWorkerEnd,
67
StringDedupQueueFixup,
68
StringDedupTableFixup,
69
RedirtyCards,
70
GCParPhasesSentinel
71
};
72
73
private:
74
// Markers for grouping the phases in the GCPhases enum above
75
static const int GCMainParPhasesLast = GCWorkerEnd;
76
static const int StringDedupPhasesFirst = StringDedupQueueFixup;
77
static const int StringDedupPhasesLast = StringDedupTableFixup;
78
79
WorkerDataArray<double>* _gc_par_phases[GCParPhasesSentinel];
80
WorkerDataArray<size_t>* _update_rs_processed_buffers;
81
WorkerDataArray<size_t>* _termination_attempts;
82
WorkerDataArray<size_t>* _redirtied_cards;
83
84
double _cur_collection_par_time_ms;
85
double _cur_collection_code_root_fixup_time_ms;
86
double _cur_strong_code_root_purge_time_ms;
87
88
double _cur_evac_fail_recalc_used;
89
double _cur_evac_fail_restore_remsets;
90
double _cur_evac_fail_remove_self_forwards;
91
92
double _cur_string_dedup_fixup_time_ms;
93
94
double _cur_clear_ct_time_ms;
95
double _cur_ref_proc_time_ms;
96
double _cur_ref_enq_time_ms;
97
98
double _cur_collection_start_sec;
99
double _root_region_scan_wait_time_ms;
100
101
double _recorded_young_cset_choice_time_ms;
102
double _recorded_non_young_cset_choice_time_ms;
103
104
double _recorded_redirty_logged_cards_time_ms;
105
106
double _recorded_young_free_cset_time_ms;
107
double _recorded_non_young_free_cset_time_ms;
108
109
double _cur_fast_reclaim_humongous_time_ms;
110
double _cur_fast_reclaim_humongous_register_time_ms;
111
size_t _cur_fast_reclaim_humongous_total;
112
size_t _cur_fast_reclaim_humongous_candidates;
113
size_t _cur_fast_reclaim_humongous_reclaimed;
114
115
double _cur_verify_before_time_ms;
116
double _cur_verify_after_time_ms;
117
118
// Helper methods for detailed logging
119
void print_stats(int level, const char* str, double value);
120
void print_stats(int level, const char* str, size_t value);
121
void print_stats(int level, const char* str, double value, uint workers);
122
123
public:
124
G1GCPhaseTimes(uint max_gc_threads);
125
void note_gc_start(uint active_gc_threads, bool mark_in_progress);
126
void note_gc_end();
127
void print(double pause_time_sec);
128
129
// record the time a phase took in seconds
130
void record_time_secs(GCParPhases phase, uint worker_i, double secs);
131
132
// add a number of seconds to a phase
133
void add_time_secs(GCParPhases phase, uint worker_i, double secs);
134
135
void record_thread_work_item(GCParPhases phase, uint worker_i, size_t count);
136
137
// return the average time for a phase in milliseconds
138
double average_time_ms(GCParPhases phase);
139
140
size_t sum_thread_work_items(GCParPhases phase);
141
142
private:
143
double get_time_ms(GCParPhases phase, uint worker_i);
144
double sum_time_ms(GCParPhases phase);
145
double min_time_ms(GCParPhases phase);
146
double max_time_ms(GCParPhases phase);
147
size_t get_thread_work_item(GCParPhases phase, uint worker_i);
148
double average_thread_work_items(GCParPhases phase);
149
size_t min_thread_work_items(GCParPhases phase);
150
size_t max_thread_work_items(GCParPhases phase);
151
152
public:
153
154
void record_clear_ct_time(double ms) {
155
_cur_clear_ct_time_ms = ms;
156
}
157
158
void record_par_time(double ms) {
159
_cur_collection_par_time_ms = ms;
160
}
161
162
void record_code_root_fixup_time(double ms) {
163
_cur_collection_code_root_fixup_time_ms = ms;
164
}
165
166
void record_strong_code_root_purge_time(double ms) {
167
_cur_strong_code_root_purge_time_ms = ms;
168
}
169
170
void record_evac_fail_recalc_used_time(double ms) {
171
_cur_evac_fail_recalc_used = ms;
172
}
173
174
void record_evac_fail_restore_remsets(double ms) {
175
_cur_evac_fail_restore_remsets = ms;
176
}
177
178
void record_evac_fail_remove_self_forwards(double ms) {
179
_cur_evac_fail_remove_self_forwards = ms;
180
}
181
182
void record_string_dedup_fixup_time(double ms) {
183
_cur_string_dedup_fixup_time_ms = ms;
184
}
185
186
void record_ref_proc_time(double ms) {
187
_cur_ref_proc_time_ms = ms;
188
}
189
190
void record_ref_enq_time(double ms) {
191
_cur_ref_enq_time_ms = ms;
192
}
193
194
void record_root_region_scan_wait_time(double time_ms) {
195
_root_region_scan_wait_time_ms = time_ms;
196
}
197
198
void record_young_free_cset_time_ms(double time_ms) {
199
_recorded_young_free_cset_time_ms = time_ms;
200
}
201
202
void record_non_young_free_cset_time_ms(double time_ms) {
203
_recorded_non_young_free_cset_time_ms = time_ms;
204
}
205
206
void record_fast_reclaim_humongous_stats(double time_ms, size_t total, size_t candidates) {
207
_cur_fast_reclaim_humongous_register_time_ms = time_ms;
208
_cur_fast_reclaim_humongous_total = total;
209
_cur_fast_reclaim_humongous_candidates = candidates;
210
}
211
212
void record_fast_reclaim_humongous_time_ms(double value, size_t reclaimed) {
213
_cur_fast_reclaim_humongous_time_ms = value;
214
_cur_fast_reclaim_humongous_reclaimed = reclaimed;
215
}
216
217
void record_young_cset_choice_time_ms(double time_ms) {
218
_recorded_young_cset_choice_time_ms = time_ms;
219
}
220
221
void record_non_young_cset_choice_time_ms(double time_ms) {
222
_recorded_non_young_cset_choice_time_ms = time_ms;
223
}
224
225
void record_redirty_logged_cards_time_ms(double time_ms) {
226
_recorded_redirty_logged_cards_time_ms = time_ms;
227
}
228
229
void record_cur_collection_start_sec(double time_ms) {
230
_cur_collection_start_sec = time_ms;
231
}
232
233
void record_verify_before_time_ms(double time_ms) {
234
_cur_verify_before_time_ms = time_ms;
235
}
236
237
void record_verify_after_time_ms(double time_ms) {
238
_cur_verify_after_time_ms = time_ms;
239
}
240
241
double accounted_time_ms();
242
243
double cur_collection_start_sec() {
244
return _cur_collection_start_sec;
245
}
246
247
double cur_collection_par_time_ms() {
248
return _cur_collection_par_time_ms;
249
}
250
251
double cur_clear_ct_time_ms() {
252
return _cur_clear_ct_time_ms;
253
}
254
255
double root_region_scan_wait_time_ms() {
256
return _root_region_scan_wait_time_ms;
257
}
258
259
double young_cset_choice_time_ms() {
260
return _recorded_young_cset_choice_time_ms;
261
}
262
263
double young_free_cset_time_ms() {
264
return _recorded_young_free_cset_time_ms;
265
}
266
267
double non_young_cset_choice_time_ms() {
268
return _recorded_non_young_cset_choice_time_ms;
269
}
270
271
double non_young_free_cset_time_ms() {
272
return _recorded_non_young_free_cset_time_ms;
273
}
274
275
double fast_reclaim_humongous_time_ms() {
276
return _cur_fast_reclaim_humongous_time_ms;
277
}
278
};
279
280
class G1GCParPhaseTimesTracker : public StackObj {
281
Ticks _start_time;
282
G1GCPhaseTimes::GCParPhases _phase;
283
G1GCPhaseTimes* _phase_times;
284
uint _worker_id;
285
public:
286
G1GCParPhaseTimesTracker(G1GCPhaseTimes* phase_times, G1GCPhaseTimes::GCParPhases phase, uint worker_id);
287
~G1GCParPhaseTimesTracker();
288
};
289
290
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
291
292