90 return _sum;
91 }
92
93 void print(int level, const char* title);
94
95 void reset() PRODUCT_RETURN;
96 void verify() PRODUCT_RETURN;
97
98 private:
99
100 void calculate_totals(){
101 _sum = (T)0;
102 for (uint i = 0; i < _length; ++i) {
103 _sum += _data[i];
104 }
105 _average = (double)_sum / (double)_length;
106 _has_new_data = false;
107 }
108 };
109
110 class G1GCPhaseTimes : public CHeapObj<mtGC> {
111
112 private:
113 uint _active_gc_threads;
114 uint _max_gc_threads;
115
116 WorkerDataArray<double> _last_gc_worker_start_times_ms;
117 WorkerDataArray<double> _last_ext_root_scan_times_ms;
118 WorkerDataArray<double> _last_satb_filtering_times_ms;
119 WorkerDataArray<double> _last_update_rs_times_ms;
120 WorkerDataArray<int> _last_update_rs_processed_buffers;
121 WorkerDataArray<double> _last_scan_rs_times_ms;
122 WorkerDataArray<double> _last_strong_code_root_scan_times_ms;
123 WorkerDataArray<double> _last_obj_copy_times_ms;
124 WorkerDataArray<double> _last_termination_times_ms;
125 WorkerDataArray<size_t> _last_termination_attempts;
126 WorkerDataArray<double> _last_gc_worker_end_times_ms;
127 WorkerDataArray<double> _last_gc_worker_times_ms;
128 WorkerDataArray<double> _last_gc_worker_other_times_ms;
129
130 double _cur_collection_par_time_ms;
131 double _cur_collection_code_root_fixup_time_ms;
132 double _cur_strong_code_root_purge_time_ms;
133
134 double _cur_evac_fail_recalc_used;
135 double _cur_evac_fail_restore_remsets;
136 double _cur_evac_fail_remove_self_forwards;
137
154 double _recorded_redirty_logged_cards_time_ms;
155
156 double _recorded_young_free_cset_time_ms;
157 double _recorded_non_young_free_cset_time_ms;
158
159 double _cur_fast_reclaim_humongous_time_ms;
160 double _cur_fast_reclaim_humongous_register_time_ms;
161 size_t _cur_fast_reclaim_humongous_total;
162 size_t _cur_fast_reclaim_humongous_candidates;
163 size_t _cur_fast_reclaim_humongous_reclaimed;
164
165 double _cur_verify_before_time_ms;
166 double _cur_verify_after_time_ms;
167
168 // Helper methods for detailed logging
169 void print_stats(int level, const char* str, double value);
170 void print_stats(int level, const char* str, size_t value);
171 void print_stats(int level, const char* str, double value, uint workers);
172
173 public:
174 G1GCPhaseTimes(uint max_gc_threads);
175 void note_gc_start(uint active_gc_threads);
176 void note_gc_end();
177 void print(double pause_time_sec);
178
179 void record_gc_worker_start_time(uint worker_i, double ms) {
180 _last_gc_worker_start_times_ms.set(worker_i, ms);
181 }
182
183 void record_ext_root_scan_time(uint worker_i, double ms) {
184 _last_ext_root_scan_times_ms.set(worker_i, ms);
185 }
186
187 void record_satb_filtering_time(uint worker_i, double ms) {
188 _last_satb_filtering_times_ms.set(worker_i, ms);
189 }
190
191 void record_update_rs_time(uint worker_i, double ms) {
192 _last_update_rs_times_ms.set(worker_i, ms);
193 }
194
|
90 return _sum;
91 }
92
93 void print(int level, const char* title);
94
95 void reset() PRODUCT_RETURN;
96 void verify() PRODUCT_RETURN;
97
98 private:
99
100 void calculate_totals(){
101 _sum = (T)0;
102 for (uint i = 0; i < _length; ++i) {
103 _sum += _data[i];
104 }
105 _average = (double)_sum / (double)_length;
106 _has_new_data = false;
107 }
108 };
109
110 class GCPhaseTimeTracker VALUE_OBJ_CLASS_SPEC {
111 private:
112 friend class G1GCPhaseTimes;
113
114 WorkerDataArray<double>** _data;
115 uint _num_phases;
116 uint _worker_id;
117 public:
118 GCPhaseTimeTracker(WorkerDataArray<double>** data, uint num_phases, uint worker_id) :
119 _data(data), _num_phases(num_phases), _worker_id(worker_id) { }
120
121 bool active() const { return _num_phases > 0; }
122
123 void set_value(uint phase, double value) {
124 assert(_data != NULL, "just checking");
125 _data[phase]->set(_worker_id, value);
126 }
127 };
128
129 class G1GCPhaseTimes : public CHeapObj<mtGC> {
130
131 private:
132 uint _active_gc_threads;
133 uint _max_gc_threads;
134 uint _num_ext_root_scan_phases;
135
136 bool track_ext_root_scan_phases() const { return _num_ext_root_scan_phases > 0; }
137
138 WorkerDataArray<double> _last_gc_worker_start_times_ms;
139 WorkerDataArray<double> _last_ext_root_scan_times_ms;
140 WorkerDataArray<double>** _last_ext_root_scan_phase_times_ms;
141 WorkerDataArray<double> _last_satb_filtering_times_ms;
142 WorkerDataArray<double> _last_update_rs_times_ms;
143 WorkerDataArray<int> _last_update_rs_processed_buffers;
144 WorkerDataArray<double> _last_scan_rs_times_ms;
145 WorkerDataArray<double> _last_strong_code_root_scan_times_ms;
146 WorkerDataArray<double> _last_obj_copy_times_ms;
147 WorkerDataArray<double> _last_termination_times_ms;
148 WorkerDataArray<size_t> _last_termination_attempts;
149 WorkerDataArray<double> _last_gc_worker_end_times_ms;
150 WorkerDataArray<double> _last_gc_worker_times_ms;
151 WorkerDataArray<double> _last_gc_worker_other_times_ms;
152
153 double _cur_collection_par_time_ms;
154 double _cur_collection_code_root_fixup_time_ms;
155 double _cur_strong_code_root_purge_time_ms;
156
157 double _cur_evac_fail_recalc_used;
158 double _cur_evac_fail_restore_remsets;
159 double _cur_evac_fail_remove_self_forwards;
160
177 double _recorded_redirty_logged_cards_time_ms;
178
179 double _recorded_young_free_cset_time_ms;
180 double _recorded_non_young_free_cset_time_ms;
181
182 double _cur_fast_reclaim_humongous_time_ms;
183 double _cur_fast_reclaim_humongous_register_time_ms;
184 size_t _cur_fast_reclaim_humongous_total;
185 size_t _cur_fast_reclaim_humongous_candidates;
186 size_t _cur_fast_reclaim_humongous_reclaimed;
187
188 double _cur_verify_before_time_ms;
189 double _cur_verify_after_time_ms;
190
191 // Helper methods for detailed logging
192 void print_stats(int level, const char* str, double value);
193 void print_stats(int level, const char* str, size_t value);
194 void print_stats(int level, const char* str, double value, uint workers);
195
196 public:
197 G1GCPhaseTimes(uint max_gc_threads, uint num_ext_root_scan_phases);
198 virtual ~G1GCPhaseTimes();
199
200 WorkerDataArray<double>** get_ext_root_scan_phase_times() const { return _last_ext_root_scan_phase_times_ms; }
201 uint num_ext_root_scan_phases() const { return _num_ext_root_scan_phases; }
202
203 void note_gc_start(uint active_gc_threads);
204 void note_gc_end();
205 void print(double pause_time_sec);
206
207 void record_gc_worker_start_time(uint worker_i, double ms) {
208 _last_gc_worker_start_times_ms.set(worker_i, ms);
209 }
210
211 void record_ext_root_scan_time(uint worker_i, double ms) {
212 _last_ext_root_scan_times_ms.set(worker_i, ms);
213 }
214
215 void record_satb_filtering_time(uint worker_i, double ms) {
216 _last_satb_filtering_times_ms.set(worker_i, ms);
217 }
218
219 void record_update_rs_time(uint worker_i, double ms) {
220 _last_update_rs_times_ms.set(worker_i, ms);
221 }
222
|