74 _gc_par_phases[Other] = new WorkerDataArray<double>(max_gc_threads, "GC Worker Other (ms):");
75
76 _update_rs_processed_buffers = new WorkerDataArray<size_t>(max_gc_threads, "Processed Buffers:");
77 _gc_par_phases[UpdateRS]->link_thread_work_items(_update_rs_processed_buffers);
78
79 _termination_attempts = new WorkerDataArray<size_t>(max_gc_threads, "Termination Attempts:");
80 _gc_par_phases[Termination]->link_thread_work_items(_termination_attempts);
81
82 if (UseStringDeduplication) {
83 _gc_par_phases[StringDedupQueueFixup] = new WorkerDataArray<double>(max_gc_threads, "Queue Fixup (ms):");
84 _gc_par_phases[StringDedupTableFixup] = new WorkerDataArray<double>(max_gc_threads, "Table Fixup (ms):");
85 } else {
86 _gc_par_phases[StringDedupQueueFixup] = NULL;
87 _gc_par_phases[StringDedupTableFixup] = NULL;
88 }
89
90 _gc_par_phases[RedirtyCards] = new WorkerDataArray<double>(max_gc_threads, "Parallel Redirty (ms):");
91 _redirtied_cards = new WorkerDataArray<size_t>(max_gc_threads, "Redirtied Cards:");
92 _gc_par_phases[RedirtyCards]->link_thread_work_items(_redirtied_cards);
93
94 _gc_par_phases[PreserveCMReferents] = new WorkerDataArray<double>(max_gc_threads, "Parallel Preserve CM Refs (ms):");
95 }
96
97 void G1GCPhaseTimes::note_gc_start() {
98 _gc_start_counter = os::elapsed_counter();
99 _cur_expand_heap_time_ms = 0.0;
100 _external_accounted_time_ms = 0.0;
101
102 for (int i = 0; i < GCParPhasesSentinel; i++) {
103 if (_gc_par_phases[i] != NULL) {
104 _gc_par_phases[i]->reset();
105 }
106 }
107 }
108
109 #define ASSERT_PHASE_UNINITIALIZED(phase) \
110 assert(_gc_par_phases[phase]->get(i) == uninitialized, "Phase " #phase " reported for thread that was not started");
111
112 double G1GCPhaseTimes::worker_time(GCParPhases phase, uint worker) {
113 double value = _gc_par_phases[phase]->get(worker);
261 debug_phase(_gc_par_phases[ScanRS]);
262 debug_phase(_gc_par_phases[CodeRoots]);
263 debug_phase(_gc_par_phases[ObjCopy]);
264 debug_phase(_gc_par_phases[Termination]);
265 debug_phase(_gc_par_phases[Other]);
266 debug_phase(_gc_par_phases[GCWorkerTotal]);
267 trace_phase(_gc_par_phases[GCWorkerEnd], false);
268
269 info_line_and_account("Code Roots", _cur_collection_code_root_fixup_time_ms + _cur_strong_code_root_purge_time_ms);
270 debug_line("Code Roots Fixup", _cur_collection_code_root_fixup_time_ms);
271 debug_line("Code Roots Purge", _cur_strong_code_root_purge_time_ms);
272
273 if (G1StringDedup::is_enabled()) {
274 info_line_and_account("String Dedup Fixup", _cur_string_dedup_fixup_time_ms);
275 debug_phase(_gc_par_phases[StringDedupQueueFixup]);
276 debug_phase(_gc_par_phases[StringDedupTableFixup]);
277 }
278 info_line_and_account("Clear Card Table", _cur_clear_ct_time_ms);
279 info_line_and_account("Expand Heap After Collection", _cur_expand_heap_time_ms);
280
281 double free_cset_time = _recorded_young_free_cset_time_ms + _recorded_non_young_free_cset_time_ms;
282 info_line_and_account("Free Collection Set", free_cset_time);
283 debug_line("Young Free Collection Set", _recorded_young_free_cset_time_ms);
284 debug_line("Non-Young Free Collection Set", _recorded_non_young_free_cset_time_ms);
285 info_line_and_account("Merge Per-Thread State", _recorded_merge_pss_time_ms);
286
287 info_line("Other", _gc_pause_time_ms - accounted_time_ms);
288 if (_cur_verify_before_time_ms > 0.0) {
289 debug_line("Verify Before", _cur_verify_before_time_ms);
290 }
291 if (G1CollectedHeap::heap()->evacuation_failed()) {
292 double evac_fail_handling = _cur_evac_fail_recalc_used + _cur_evac_fail_remove_self_forwards +
293 _cur_evac_fail_restore_remsets;
294 debug_line("Evacuation Failure", evac_fail_handling);
295 trace_line("Recalculate Used", _cur_evac_fail_recalc_used);
296 trace_line("Remove Self Forwards",_cur_evac_fail_remove_self_forwards);
297 trace_line("Restore RemSet", _cur_evac_fail_restore_remsets);
298 }
299 debug_line("Choose CSet", (_recorded_young_cset_choice_time_ms + _recorded_non_young_cset_choice_time_ms));
300 debug_line("Preserve CM Refs", _recorded_preserve_cm_referents_time_ms);
301 trace_phase(_gc_par_phases[PreserveCMReferents]);
302 debug_line("Reference Processing", _cur_ref_proc_time_ms);
303 debug_line("Reference Enqueuing", _cur_ref_enq_time_ms);
304 debug_line("Redirty Cards", _recorded_redirty_logged_cards_time_ms);
|
74 _gc_par_phases[Other] = new WorkerDataArray<double>(max_gc_threads, "GC Worker Other (ms):");
75
76 _update_rs_processed_buffers = new WorkerDataArray<size_t>(max_gc_threads, "Processed Buffers:");
77 _gc_par_phases[UpdateRS]->link_thread_work_items(_update_rs_processed_buffers);
78
79 _termination_attempts = new WorkerDataArray<size_t>(max_gc_threads, "Termination Attempts:");
80 _gc_par_phases[Termination]->link_thread_work_items(_termination_attempts);
81
82 if (UseStringDeduplication) {
83 _gc_par_phases[StringDedupQueueFixup] = new WorkerDataArray<double>(max_gc_threads, "Queue Fixup (ms):");
84 _gc_par_phases[StringDedupTableFixup] = new WorkerDataArray<double>(max_gc_threads, "Table Fixup (ms):");
85 } else {
86 _gc_par_phases[StringDedupQueueFixup] = NULL;
87 _gc_par_phases[StringDedupTableFixup] = NULL;
88 }
89
90 _gc_par_phases[RedirtyCards] = new WorkerDataArray<double>(max_gc_threads, "Parallel Redirty (ms):");
91 _redirtied_cards = new WorkerDataArray<size_t>(max_gc_threads, "Redirtied Cards:");
92 _gc_par_phases[RedirtyCards]->link_thread_work_items(_redirtied_cards);
93
94 _gc_par_phases[YoungFreeCSet] = new WorkerDataArray<double>(max_gc_threads, "Young Free Collection Set (ms):");
95 _gc_par_phases[NonYoungFreeCSet] = new WorkerDataArray<double>(max_gc_threads, "Non-Young Free Collection Set (ms):");
96
97 _gc_par_phases[PreserveCMReferents] = new WorkerDataArray<double>(max_gc_threads, "Parallel Preserve CM Refs (ms):");
98 }
99
100 void G1GCPhaseTimes::note_gc_start() {
101 _gc_start_counter = os::elapsed_counter();
102 _cur_expand_heap_time_ms = 0.0;
103 _external_accounted_time_ms = 0.0;
104
105 for (int i = 0; i < GCParPhasesSentinel; i++) {
106 if (_gc_par_phases[i] != NULL) {
107 _gc_par_phases[i]->reset();
108 }
109 }
110 }
111
112 #define ASSERT_PHASE_UNINITIALIZED(phase) \
113 assert(_gc_par_phases[phase]->get(i) == uninitialized, "Phase " #phase " reported for thread that was not started");
114
115 double G1GCPhaseTimes::worker_time(GCParPhases phase, uint worker) {
116 double value = _gc_par_phases[phase]->get(worker);
264 debug_phase(_gc_par_phases[ScanRS]);
265 debug_phase(_gc_par_phases[CodeRoots]);
266 debug_phase(_gc_par_phases[ObjCopy]);
267 debug_phase(_gc_par_phases[Termination]);
268 debug_phase(_gc_par_phases[Other]);
269 debug_phase(_gc_par_phases[GCWorkerTotal]);
270 trace_phase(_gc_par_phases[GCWorkerEnd], false);
271
272 info_line_and_account("Code Roots", _cur_collection_code_root_fixup_time_ms + _cur_strong_code_root_purge_time_ms);
273 debug_line("Code Roots Fixup", _cur_collection_code_root_fixup_time_ms);
274 debug_line("Code Roots Purge", _cur_strong_code_root_purge_time_ms);
275
276 if (G1StringDedup::is_enabled()) {
277 info_line_and_account("String Dedup Fixup", _cur_string_dedup_fixup_time_ms);
278 debug_phase(_gc_par_phases[StringDedupQueueFixup]);
279 debug_phase(_gc_par_phases[StringDedupTableFixup]);
280 }
281 info_line_and_account("Clear Card Table", _cur_clear_ct_time_ms);
282 info_line_and_account("Expand Heap After Collection", _cur_expand_heap_time_ms);
283
284 info_line_and_account("Free Collection Set", _recorded_total_free_cset_time_ms);
285 debug_line("Free Collection Set Serial", _recorded_serial_free_cset_time_ms);
286 debug_phase(_gc_par_phases[YoungFreeCSet]);
287 debug_phase(_gc_par_phases[NonYoungFreeCSet]);
288
289 info_line_and_account("Merge Per-Thread State", _recorded_merge_pss_time_ms);
290
291 info_line("Other", _gc_pause_time_ms - accounted_time_ms);
292 if (_cur_verify_before_time_ms > 0.0) {
293 debug_line("Verify Before", _cur_verify_before_time_ms);
294 }
295 if (G1CollectedHeap::heap()->evacuation_failed()) {
296 double evac_fail_handling = _cur_evac_fail_recalc_used + _cur_evac_fail_remove_self_forwards +
297 _cur_evac_fail_restore_remsets;
298 debug_line("Evacuation Failure", evac_fail_handling);
299 trace_line("Recalculate Used", _cur_evac_fail_recalc_used);
300 trace_line("Remove Self Forwards",_cur_evac_fail_remove_self_forwards);
301 trace_line("Restore RemSet", _cur_evac_fail_restore_remsets);
302 }
303 debug_line("Choose CSet", (_recorded_young_cset_choice_time_ms + _recorded_non_young_cset_choice_time_ms));
304 debug_line("Preserve CM Refs", _recorded_preserve_cm_referents_time_ms);
305 trace_phase(_gc_par_phases[PreserveCMReferents]);
306 debug_line("Reference Processing", _cur_ref_proc_time_ms);
307 debug_line("Reference Enqueuing", _cur_ref_enq_time_ms);
308 debug_line("Redirty Cards", _recorded_redirty_logged_cards_time_ms);
|