55 if (!_policy->is_at_shutdown()) {
56 _timing_data[phase]._secs.add((double)time_us / 1000 / 1000);
57 }
58 }
59
60 void ShenandoahPhaseTimings::record_workers_start(Phase phase) {
61 for (uint i = 0; i < GCParPhasesSentinel; i++) {
62 _worker_times->reset(i);
63 }
64 }
65
66 void ShenandoahPhaseTimings::record_workers_end(Phase phase) {
67 if (_policy->is_at_shutdown()) {
68 // Do not record the past-shutdown events
69 return;
70 }
71
72 guarantee(phase == init_evac ||
73 phase == scan_roots ||
74 phase == update_roots ||
75 phase == init_partial_gc_work ||
76 phase == final_partial_gc_work ||
77 phase == init_traversal_gc_work ||
78 phase == final_traversal_gc_work ||
79 phase == final_traversal_update_roots ||
80 phase == final_update_refs_roots ||
81 phase == full_gc_roots ||
82 phase == _num_phases,
83 "only in these phases we can add per-thread phase times");
84 if (phase != _num_phases) {
85 // Merge _phase_time to counters below the given phase.
86 for (uint i = 0; i < GCParPhasesSentinel; i++) {
87 double t = _worker_times->average(i);
88 _timing_data[phase + i + 1]._secs.add(t);
89 }
90 }
91 }
92
93 void ShenandoahPhaseTimings::print_on(outputStream* out) const {
94 out->cr();
95 out->print_cr("GC STATISTICS:");
96 out->print_cr(" \"(G)\" (gross) pauses include VM time: time to notify and block threads, do the pre-");
230 _phase_names[full_gc_purge] = " System Purge";
231 _phase_names[full_gc_purge_class_unload] = " Unload Classes";
232 _phase_names[full_gc_purge_par] = " Parallel Cleanup";
233 _phase_names[full_gc_purge_par_codecache] = " Code Cache";
234 _phase_names[full_gc_purge_par_symbstring] = " String/Symbol Tables";
235 _phase_names[full_gc_purge_par_rmt] = " Resolved Methods";
236 _phase_names[full_gc_purge_par_classes] = " Clean Classes";
237 _phase_names[full_gc_purge_par_sync] = " Synchronization";
238 _phase_names[full_gc_purge_cldg] = " CLDG";
239 _phase_names[full_gc_purge_par_string_dedup] = " Purge String Dedup";
240 _phase_names[full_gc_calculate_addresses] = " Calculate Addresses";
241 _phase_names[full_gc_calculate_addresses_regular] = " Regular Objects";
242 _phase_names[full_gc_calculate_addresses_humong] = " Humongous Objects";
243 _phase_names[full_gc_adjust_pointers] = " Adjust Pointers";
244 _phase_names[full_gc_copy_objects] = " Copy Objects";
245 _phase_names[full_gc_copy_objects_regular] = " Regular Objects";
246 _phase_names[full_gc_copy_objects_humong] = " Humongous Objects";
247 _phase_names[full_gc_update_str_dedup_table] = " Update String Dedup Table";
248 _phase_names[full_gc_resize_tlabs] = " Resize TLABs";
249
250 _phase_names[init_partial_gc_gross] = "Pause Init Partial (G)";
251 _phase_names[init_partial_gc] = "Pause Init Partial (N)";
252 _phase_names[partial_gc_prepare] = " Prepare";
253 _phase_names[init_partial_gc_work] = " Work";
254 _phase_names[init_partial_gc_thread_roots] = " PI: Thread Roots";
255 _phase_names[init_partial_gc_code_roots] = " PI: Code Cache Roots";
256 _phase_names[init_partial_gc_string_table_roots] = " PI: String Table Roots";
257 _phase_names[init_partial_gc_universe_roots] = " PI: Universe Roots";
258 _phase_names[init_partial_gc_jni_roots] = " PI: JNI Roots";
259 _phase_names[init_partial_gc_jni_weak_roots] = " PI: JNI Weak Roots";
260 _phase_names[init_partial_gc_synchronizer_roots] = " PI: Synchronizer Roots";
261 _phase_names[init_partial_gc_flat_profiler_roots] = " PI: Flat Profiler Roots";
262 _phase_names[init_partial_gc_management_roots] = " PI: Management Roots";
263 _phase_names[init_partial_gc_system_dict_roots] = " PI: System Dict Roots";
264 _phase_names[init_partial_gc_cldg_roots] = " PI: CLDG Roots";
265 _phase_names[init_partial_gc_jvmti_roots] = " PI: JVMTI Roots";
266 _phase_names[init_partial_gc_string_dedup_roots] = " PI: String Dedup Roots";
267 _phase_names[init_partial_gc_finish_queues] = " PI: Finish Queues";
268 _phase_names[final_partial_gc_gross] = "Pause Final Partial (G)";
269 _phase_names[final_partial_gc] = "Pause Final Partial (N)";
270 _phase_names[final_partial_gc_work] = " Work";
271 _phase_names[final_partial_gc_thread_roots] = " PF: Thread Roots";
272 _phase_names[final_partial_gc_code_roots] = " PF: Code Cache Roots";
273 _phase_names[final_partial_gc_string_table_roots] = " PF: String Table Roots";
274 _phase_names[final_partial_gc_universe_roots] = " PF: Universe Roots";
275 _phase_names[final_partial_gc_jni_roots] = " PF: JNI Roots";
276 _phase_names[final_partial_gc_jni_weak_roots] = " PF: JNI Weak Roots";
277 _phase_names[final_partial_gc_synchronizer_roots] = " PF: Synchronizer Roots";
278 _phase_names[final_partial_gc_flat_profiler_roots] = " PF: Flat Profiler Roots";
279 _phase_names[final_partial_gc_management_roots] = " PF: Management Roots";
280 _phase_names[final_partial_gc_system_dict_roots] = " PF: System Dict Roots";
281 _phase_names[final_partial_gc_cldg_roots] = " PF: CLDG Roots";
282 _phase_names[final_partial_gc_jvmti_roots] = " PF: JVMTI Roots";
283 _phase_names[final_partial_gc_string_dedup_roots] = " PF: String Dedup Roots";
284 _phase_names[final_partial_gc_finish_queues] = " PF: Finish Queues";
285
286 _phase_names[partial_gc_cleanup] = " Cleanup";
287
288 _phase_names[init_traversal_gc_gross] = "Pause Init Traversal (G)";
289 _phase_names[init_traversal_gc] = "Pause Init Traversal (N)";
290 _phase_names[traversal_gc_prepare] = " Prepare";
291 _phase_names[init_traversal_gc_work] = " Work";
292 _phase_names[init_traversal_gc_thread_roots] = " TI: Thread Roots";
293 _phase_names[init_traversal_gc_code_roots] = " TI: Code Cache Roots";
294 _phase_names[init_traversal_gc_string_table_roots] = " TI: String Table Roots";
295 _phase_names[init_traversal_gc_universe_roots] = " TI: Universe Roots";
296 _phase_names[init_traversal_gc_jni_roots] = " TI: JNI Roots";
297 _phase_names[init_traversal_gc_jni_weak_roots] = " TI: JNI Weak Roots";
298 _phase_names[init_traversal_gc_synchronizer_roots] = " TI: Synchronizer Roots";
299 _phase_names[init_traversal_gc_flat_profiler_roots] = " TI: Flat Profiler Roots";
300 _phase_names[init_traversal_gc_management_roots] = " TI: Management Roots";
301 _phase_names[init_traversal_gc_system_dict_roots] = " TI: System Dict Roots";
302 _phase_names[init_traversal_gc_cldg_roots] = " TI: CLDG Roots";
303 _phase_names[init_traversal_gc_jvmti_roots] = " TI: JVMTI Roots";
304 _phase_names[init_traversal_gc_string_dedup_roots] = " TI: String Dedup Roots";
305 _phase_names[init_traversal_gc_finish_queues] = " TI: Finish Queues";
306 _phase_names[final_traversal_gc_gross] = "Pause Final Traversal (G)";
307 _phase_names[final_traversal_gc] = "Pause Final Traversal (N)";
330 _phase_names[final_traversal_update_synchronizer_roots] = " TU: Synchronizer Roots";
331 _phase_names[final_traversal_update_flat_profiler_roots] = " TU: Flat Profiler Roots";
332 _phase_names[final_traversal_update_management_roots] = " TU: Management Roots";
333 _phase_names[final_traversal_update_system_dict_roots] = " TU: System Dict Roots";
334 _phase_names[final_traversal_update_cldg_roots] = " TU: CLDG Roots";
335 _phase_names[final_traversal_update_jvmti_roots] = " TU: JVMTI Roots";
336 _phase_names[final_traversal_update_string_dedup_roots] = " TU: String Dedup Roots";
337 _phase_names[final_traversal_update_finish_queues] = " TU: Finish Queues";
338
339 _phase_names[traversal_gc_cleanup] = " Cleanup";
340
341 _phase_names[pause_other] = "Pause Other";
342
343 _phase_names[conc_mark] = "Concurrent Marking";
344 _phase_names[conc_preclean] = "Concurrent Precleaning";
345 _phase_names[conc_evac] = "Concurrent Evacuation";
346 _phase_names[conc_cleanup] = "Concurrent Cleanup";
347 _phase_names[conc_cleanup_recycle] = " Recycle";
348 _phase_names[conc_cleanup_reset_bitmaps] = " Reset Bitmaps";
349 _phase_names[conc_other] = "Concurrent Other";
350 _phase_names[conc_partial] = "Concurrent Partial";
351 _phase_names[conc_traversal] = "Concurrent Traversal";
352
353 _phase_names[init_update_refs_gross] = "Pause Init Update Refs (G)";
354 _phase_names[init_update_refs] = "Pause Init Update Refs (N)";
355 _phase_names[conc_update_refs] = "Concurrent Update Refs";
356 _phase_names[final_update_refs_gross] = "Pause Final Update Refs (G)";
357 _phase_names[final_update_refs] = "Pause Final Update Refs (N)";
358
359 _phase_names[final_update_refs_finish_work] = " Finish Work";
360 _phase_names[final_update_refs_roots] = " Update Roots";
361 _phase_names[final_update_refs_thread_roots] = " UR: Thread Roots";
362 _phase_names[final_update_refs_code_roots] = " UR: Code Cache Roots";
363 _phase_names[final_update_refs_string_table_roots] = " UR: String Table Roots";
364 _phase_names[final_update_refs_universe_roots] = " UR: Universe Roots";
365 _phase_names[final_update_refs_jni_roots] = " UR: JNI Roots";
366 _phase_names[final_update_refs_jni_weak_roots] = " UR: JNI Weak Roots";
367 _phase_names[final_update_refs_synchronizer_roots] = " UR: Synchronizer Roots";
368 _phase_names[final_update_refs_flat_profiler_roots] = " UR: Flat Profiler Roots";
369 _phase_names[final_update_refs_management_roots] = " UR: Management Roots";
370 _phase_names[final_update_refs_system_dict_roots] = " UR: System Dict Roots";
|
55 if (!_policy->is_at_shutdown()) {
56 _timing_data[phase]._secs.add((double)time_us / 1000 / 1000);
57 }
58 }
59
60 void ShenandoahPhaseTimings::record_workers_start(Phase phase) {
61 for (uint i = 0; i < GCParPhasesSentinel; i++) {
62 _worker_times->reset(i);
63 }
64 }
65
66 void ShenandoahPhaseTimings::record_workers_end(Phase phase) {
67 if (_policy->is_at_shutdown()) {
68 // Do not record the past-shutdown events
69 return;
70 }
71
72 guarantee(phase == init_evac ||
73 phase == scan_roots ||
74 phase == update_roots ||
75 phase == init_traversal_gc_work ||
76 phase == final_traversal_gc_work ||
77 phase == final_traversal_update_roots ||
78 phase == final_update_refs_roots ||
79 phase == full_gc_roots ||
80 phase == _num_phases,
81 "only in these phases we can add per-thread phase times");
82 if (phase != _num_phases) {
83 // Merge _phase_time to counters below the given phase.
84 for (uint i = 0; i < GCParPhasesSentinel; i++) {
85 double t = _worker_times->average(i);
86 _timing_data[phase + i + 1]._secs.add(t);
87 }
88 }
89 }
90
91 void ShenandoahPhaseTimings::print_on(outputStream* out) const {
92 out->cr();
93 out->print_cr("GC STATISTICS:");
94 out->print_cr(" \"(G)\" (gross) pauses include VM time: time to notify and block threads, do the pre-");
228 _phase_names[full_gc_purge] = " System Purge";
229 _phase_names[full_gc_purge_class_unload] = " Unload Classes";
230 _phase_names[full_gc_purge_par] = " Parallel Cleanup";
231 _phase_names[full_gc_purge_par_codecache] = " Code Cache";
232 _phase_names[full_gc_purge_par_symbstring] = " String/Symbol Tables";
233 _phase_names[full_gc_purge_par_rmt] = " Resolved Methods";
234 _phase_names[full_gc_purge_par_classes] = " Clean Classes";
235 _phase_names[full_gc_purge_par_sync] = " Synchronization";
236 _phase_names[full_gc_purge_cldg] = " CLDG";
237 _phase_names[full_gc_purge_par_string_dedup] = " Purge String Dedup";
238 _phase_names[full_gc_calculate_addresses] = " Calculate Addresses";
239 _phase_names[full_gc_calculate_addresses_regular] = " Regular Objects";
240 _phase_names[full_gc_calculate_addresses_humong] = " Humongous Objects";
241 _phase_names[full_gc_adjust_pointers] = " Adjust Pointers";
242 _phase_names[full_gc_copy_objects] = " Copy Objects";
243 _phase_names[full_gc_copy_objects_regular] = " Regular Objects";
244 _phase_names[full_gc_copy_objects_humong] = " Humongous Objects";
245 _phase_names[full_gc_update_str_dedup_table] = " Update String Dedup Table";
246 _phase_names[full_gc_resize_tlabs] = " Resize TLABs";
247
248 _phase_names[init_traversal_gc_gross] = "Pause Init Traversal (G)";
249 _phase_names[init_traversal_gc] = "Pause Init Traversal (N)";
250 _phase_names[traversal_gc_prepare] = " Prepare";
251 _phase_names[init_traversal_gc_work] = " Work";
252 _phase_names[init_traversal_gc_thread_roots] = " TI: Thread Roots";
253 _phase_names[init_traversal_gc_code_roots] = " TI: Code Cache Roots";
254 _phase_names[init_traversal_gc_string_table_roots] = " TI: String Table Roots";
255 _phase_names[init_traversal_gc_universe_roots] = " TI: Universe Roots";
256 _phase_names[init_traversal_gc_jni_roots] = " TI: JNI Roots";
257 _phase_names[init_traversal_gc_jni_weak_roots] = " TI: JNI Weak Roots";
258 _phase_names[init_traversal_gc_synchronizer_roots] = " TI: Synchronizer Roots";
259 _phase_names[init_traversal_gc_flat_profiler_roots] = " TI: Flat Profiler Roots";
260 _phase_names[init_traversal_gc_management_roots] = " TI: Management Roots";
261 _phase_names[init_traversal_gc_system_dict_roots] = " TI: System Dict Roots";
262 _phase_names[init_traversal_gc_cldg_roots] = " TI: CLDG Roots";
263 _phase_names[init_traversal_gc_jvmti_roots] = " TI: JVMTI Roots";
264 _phase_names[init_traversal_gc_string_dedup_roots] = " TI: String Dedup Roots";
265 _phase_names[init_traversal_gc_finish_queues] = " TI: Finish Queues";
266 _phase_names[final_traversal_gc_gross] = "Pause Final Traversal (G)";
267 _phase_names[final_traversal_gc] = "Pause Final Traversal (N)";
290 _phase_names[final_traversal_update_synchronizer_roots] = " TU: Synchronizer Roots";
291 _phase_names[final_traversal_update_flat_profiler_roots] = " TU: Flat Profiler Roots";
292 _phase_names[final_traversal_update_management_roots] = " TU: Management Roots";
293 _phase_names[final_traversal_update_system_dict_roots] = " TU: System Dict Roots";
294 _phase_names[final_traversal_update_cldg_roots] = " TU: CLDG Roots";
295 _phase_names[final_traversal_update_jvmti_roots] = " TU: JVMTI Roots";
296 _phase_names[final_traversal_update_string_dedup_roots] = " TU: String Dedup Roots";
297 _phase_names[final_traversal_update_finish_queues] = " TU: Finish Queues";
298
299 _phase_names[traversal_gc_cleanup] = " Cleanup";
300
301 _phase_names[pause_other] = "Pause Other";
302
303 _phase_names[conc_mark] = "Concurrent Marking";
304 _phase_names[conc_preclean] = "Concurrent Precleaning";
305 _phase_names[conc_evac] = "Concurrent Evacuation";
306 _phase_names[conc_cleanup] = "Concurrent Cleanup";
307 _phase_names[conc_cleanup_recycle] = " Recycle";
308 _phase_names[conc_cleanup_reset_bitmaps] = " Reset Bitmaps";
309 _phase_names[conc_other] = "Concurrent Other";
310 _phase_names[conc_traversal] = "Concurrent Traversal";
311
312 _phase_names[init_update_refs_gross] = "Pause Init Update Refs (G)";
313 _phase_names[init_update_refs] = "Pause Init Update Refs (N)";
314 _phase_names[conc_update_refs] = "Concurrent Update Refs";
315 _phase_names[final_update_refs_gross] = "Pause Final Update Refs (G)";
316 _phase_names[final_update_refs] = "Pause Final Update Refs (N)";
317
318 _phase_names[final_update_refs_finish_work] = " Finish Work";
319 _phase_names[final_update_refs_roots] = " Update Roots";
320 _phase_names[final_update_refs_thread_roots] = " UR: Thread Roots";
321 _phase_names[final_update_refs_code_roots] = " UR: Code Cache Roots";
322 _phase_names[final_update_refs_string_table_roots] = " UR: String Table Roots";
323 _phase_names[final_update_refs_universe_roots] = " UR: Universe Roots";
324 _phase_names[final_update_refs_jni_roots] = " UR: JNI Roots";
325 _phase_names[final_update_refs_jni_weak_roots] = " UR: JNI Weak Roots";
326 _phase_names[final_update_refs_synchronizer_roots] = " UR: Synchronizer Roots";
327 _phase_names[final_update_refs_flat_profiler_roots] = " UR: Flat Profiler Roots";
328 _phase_names[final_update_refs_management_roots] = " UR: Management Roots";
329 _phase_names[final_update_refs_system_dict_roots] = " UR: System Dict Roots";
|