77 _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
78 _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
79 _prev_collection_pause_end_ms(0.0),
80 _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
81 _concurrent_refine_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
82 _logged_cards_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
83 _young_card_merge_to_scan_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
84 _mixed_card_merge_to_scan_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
85 _young_cost_per_card_scan_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
86 _mixed_cost_per_card_scan_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
87 _young_cost_per_card_merge_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
88 _mixed_cost_per_card_merge_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
89 _copy_cost_per_byte_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
90 _constant_other_time_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
91 _young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
92 _non_young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
93 _pending_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
94 _rs_length_seq(new TruncatedSeq(TruncatedSeqLength)),
95 _cost_per_byte_ms_during_cm_seq(new TruncatedSeq(TruncatedSeqLength)),
96 _recent_prev_end_times_for_all_gcs_sec(new TruncatedSeq(NumPrevPausesForHeuristics)),
97 _recent_avg_pause_time_ratio(0.0),
98 _last_pause_time_ratio(0.0) {
99
100 // Seed sequences with initial values.
101 _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime());
102 _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0;
103
104 int index = MIN2(ParallelGCThreads - 1, 7u);
105
106 _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
107 // Start with inverse of maximum STW cost.
108 _concurrent_refine_rate_ms_seq->add(1/cost_per_logged_card_ms_defaults[0]);
109 // Some applications have very low rates for logging cards.
110 _logged_cards_rate_ms_seq->add(0.0);
111 _young_card_merge_to_scan_ratio_seq->add(young_card_merge_to_scan_ratio_defaults[index]);
112 _young_cost_per_card_scan_ms_seq->add(young_only_cost_per_card_scan_ms_defaults[index]);
113
114 _copy_cost_per_byte_ms_seq->add(cost_per_byte_ms_defaults[index]);
115 _constant_other_time_ms_seq->add(constant_other_time_ms_defaults[index]);
116 _young_other_cost_per_region_ms_seq->add(young_other_cost_per_region_ms_defaults[index]);
117 _non_young_other_cost_per_region_ms_seq->add(non_young_other_cost_per_region_ms_defaults[index]);
118
119 // start conservatively (around 50ms is about right)
120 _concurrent_mark_remark_times_ms->add(0.05);
121 _concurrent_mark_cleanup_times_ms->add(0.20);
122 }
123
124 bool G1Analytics::enough_samples_available(TruncatedSeq const* seq) const {
125 return seq->num() >= 3;
126 }
127
128 double G1Analytics::predict_in_unit_interval(TruncatedSeq const* seq) const {
129 return _predictor->predict_in_unit_interval(seq);
130 }
131
132 size_t G1Analytics::predict_size(TruncatedSeq const* seq) const {
133 return (size_t)predict_zero_bounded(seq);
134 }
135
136 double G1Analytics::predict_zero_bounded(TruncatedSeq const* seq) const {
137 return _predictor->predict_zero_bounded(seq);
138 }
139
140 int G1Analytics::num_alloc_rate_ms() const {
141 return _alloc_rate_ms_seq->num();
211 void G1Analytics::report_young_other_cost_per_region_ms(double other_cost_per_region_ms) {
212 _young_other_cost_per_region_ms_seq->add(other_cost_per_region_ms);
213 }
214
215 void G1Analytics::report_non_young_other_cost_per_region_ms(double other_cost_per_region_ms) {
216 _non_young_other_cost_per_region_ms_seq->add(other_cost_per_region_ms);
217 }
218
219 void G1Analytics::report_constant_other_time_ms(double constant_other_time_ms) {
220 _constant_other_time_ms_seq->add(constant_other_time_ms);
221 }
222
223 void G1Analytics::report_pending_cards(double pending_cards) {
224 _pending_cards_seq->add(pending_cards);
225 }
226
227 void G1Analytics::report_rs_length(double rs_length) {
228 _rs_length_seq->add(rs_length);
229 }
230
231 double G1Analytics::predict_alloc_rate_ms() const {
232 return predict_zero_bounded(_alloc_rate_ms_seq);
233 }
234
235 double G1Analytics::predict_concurrent_refine_rate_ms() const {
236 return predict_zero_bounded(_concurrent_refine_rate_ms_seq);
237 }
238
239 double G1Analytics::predict_logged_cards_rate_ms() const {
240 return predict_zero_bounded(_logged_cards_rate_ms_seq);
241 }
242
243 double G1Analytics::predict_young_card_merge_to_scan_ratio() const {
244 return predict_in_unit_interval(_young_card_merge_to_scan_ratio_seq);
245 }
246
247 size_t G1Analytics::predict_scan_card_num(size_t rs_length, bool for_young_gc) const {
248 if (for_young_gc || !enough_samples_available(_mixed_card_merge_to_scan_ratio_seq)) {
249 return (size_t)(rs_length * predict_young_card_merge_to_scan_ratio());
250 } else {
265 return card_num * predict_zero_bounded(_young_cost_per_card_scan_ms_seq);
266 } else {
267 return card_num * predict_zero_bounded(_mixed_cost_per_card_scan_ms_seq);
268 }
269 }
270
271 double G1Analytics::predict_object_copy_time_ms_during_cm(size_t bytes_to_copy) const {
272 if (!enough_samples_available(_cost_per_byte_ms_during_cm_seq)) {
273 return (1.1 * bytes_to_copy) * predict_zero_bounded(_copy_cost_per_byte_ms_seq);
274 } else {
275 return bytes_to_copy * predict_zero_bounded(_cost_per_byte_ms_during_cm_seq);
276 }
277 }
278
279 double G1Analytics::predict_object_copy_time_ms(size_t bytes_to_copy, bool during_concurrent_mark) const {
280 if (during_concurrent_mark) {
281 return predict_object_copy_time_ms_during_cm(bytes_to_copy);
282 } else {
283 return bytes_to_copy * predict_zero_bounded(_copy_cost_per_byte_ms_seq);
284 }
285 }
286
287 double G1Analytics::predict_constant_other_time_ms() const {
288 return predict_zero_bounded(_constant_other_time_ms_seq);
289 }
290
291 double G1Analytics::predict_young_other_time_ms(size_t young_num) const {
292 return young_num * predict_zero_bounded(_young_other_cost_per_region_ms_seq);
293 }
294
295 double G1Analytics::predict_non_young_other_time_ms(size_t non_young_num) const {
296 return non_young_num * predict_zero_bounded(_non_young_other_cost_per_region_ms_seq);
297 }
298
299 double G1Analytics::predict_remark_time_ms() const {
300 return predict_zero_bounded(_concurrent_mark_remark_times_ms);
301 }
302
303 double G1Analytics::predict_cleanup_time_ms() const {
304 return predict_zero_bounded(_concurrent_mark_cleanup_times_ms);
|
77 _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
78 _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
79 _prev_collection_pause_end_ms(0.0),
80 _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
81 _concurrent_refine_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
82 _logged_cards_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
83 _young_card_merge_to_scan_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
84 _mixed_card_merge_to_scan_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
85 _young_cost_per_card_scan_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
86 _mixed_cost_per_card_scan_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
87 _young_cost_per_card_merge_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
88 _mixed_cost_per_card_merge_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
89 _copy_cost_per_byte_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
90 _constant_other_time_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
91 _young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
92 _non_young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
93 _pending_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
94 _rs_length_seq(new TruncatedSeq(TruncatedSeqLength)),
95 _cost_per_byte_ms_during_cm_seq(new TruncatedSeq(TruncatedSeqLength)),
96 _recent_prev_end_times_for_all_gcs_sec(new TruncatedSeq(NumPrevPausesForHeuristics)),
97 _survivor_ratio(new TruncatedSeq(TruncatedSeqLength)),
98 _recent_avg_pause_time_ratio(0.0),
99 _last_pause_time_ratio(0.0) {
100
101 // Seed sequences with initial values.
102 _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime());
103 _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0;
104
105 int index = MIN2(ParallelGCThreads - 1, 7u);
106
107 _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
108 // Start with inverse of maximum STW cost.
109 _concurrent_refine_rate_ms_seq->add(1/cost_per_logged_card_ms_defaults[0]);
110 // Some applications have very low rates for logging cards.
111 _logged_cards_rate_ms_seq->add(0.0);
112 _young_card_merge_to_scan_ratio_seq->add(young_card_merge_to_scan_ratio_defaults[index]);
113 _young_cost_per_card_scan_ms_seq->add(young_only_cost_per_card_scan_ms_defaults[index]);
114
115 _copy_cost_per_byte_ms_seq->add(cost_per_byte_ms_defaults[index]);
116 _constant_other_time_ms_seq->add(constant_other_time_ms_defaults[index]);
117 _young_other_cost_per_region_ms_seq->add(young_other_cost_per_region_ms_defaults[index]);
118 _non_young_other_cost_per_region_ms_seq->add(non_young_other_cost_per_region_ms_defaults[index]);
119
120 // start conservatively (around 50ms is about right)
121 _concurrent_mark_remark_times_ms->add(0.05);
122 _concurrent_mark_cleanup_times_ms->add(0.20);
123
124 _survivor_ratio->add(0.5);
125 }
126
127 bool G1Analytics::enough_samples_available(TruncatedSeq const* seq) const {
128 return seq->num() >= 3;
129 }
130
131 double G1Analytics::predict_in_unit_interval(TruncatedSeq const* seq) const {
132 return _predictor->predict_in_unit_interval(seq);
133 }
134
135 size_t G1Analytics::predict_size(TruncatedSeq const* seq) const {
136 return (size_t)predict_zero_bounded(seq);
137 }
138
139 double G1Analytics::predict_zero_bounded(TruncatedSeq const* seq) const {
140 return _predictor->predict_zero_bounded(seq);
141 }
142
143 int G1Analytics::num_alloc_rate_ms() const {
144 return _alloc_rate_ms_seq->num();
214 void G1Analytics::report_young_other_cost_per_region_ms(double other_cost_per_region_ms) {
215 _young_other_cost_per_region_ms_seq->add(other_cost_per_region_ms);
216 }
217
218 void G1Analytics::report_non_young_other_cost_per_region_ms(double other_cost_per_region_ms) {
219 _non_young_other_cost_per_region_ms_seq->add(other_cost_per_region_ms);
220 }
221
222 void G1Analytics::report_constant_other_time_ms(double constant_other_time_ms) {
223 _constant_other_time_ms_seq->add(constant_other_time_ms);
224 }
225
226 void G1Analytics::report_pending_cards(double pending_cards) {
227 _pending_cards_seq->add(pending_cards);
228 }
229
230 void G1Analytics::report_rs_length(double rs_length) {
231 _rs_length_seq->add(rs_length);
232 }
233
234 void G1Analytics::report_survivor_ratio(double ratio) {
235 _survivor_ratio->add(ratio);
236 }
237
238 double G1Analytics::predict_alloc_rate_ms() const {
239 return predict_zero_bounded(_alloc_rate_ms_seq);
240 }
241
242 double G1Analytics::predict_concurrent_refine_rate_ms() const {
243 return predict_zero_bounded(_concurrent_refine_rate_ms_seq);
244 }
245
246 double G1Analytics::predict_logged_cards_rate_ms() const {
247 return predict_zero_bounded(_logged_cards_rate_ms_seq);
248 }
249
250 double G1Analytics::predict_young_card_merge_to_scan_ratio() const {
251 return predict_in_unit_interval(_young_card_merge_to_scan_ratio_seq);
252 }
253
254 size_t G1Analytics::predict_scan_card_num(size_t rs_length, bool for_young_gc) const {
255 if (for_young_gc || !enough_samples_available(_mixed_card_merge_to_scan_ratio_seq)) {
256 return (size_t)(rs_length * predict_young_card_merge_to_scan_ratio());
257 } else {
272 return card_num * predict_zero_bounded(_young_cost_per_card_scan_ms_seq);
273 } else {
274 return card_num * predict_zero_bounded(_mixed_cost_per_card_scan_ms_seq);
275 }
276 }
277
278 double G1Analytics::predict_object_copy_time_ms_during_cm(size_t bytes_to_copy) const {
279 if (!enough_samples_available(_cost_per_byte_ms_during_cm_seq)) {
280 return (1.1 * bytes_to_copy) * predict_zero_bounded(_copy_cost_per_byte_ms_seq);
281 } else {
282 return bytes_to_copy * predict_zero_bounded(_cost_per_byte_ms_during_cm_seq);
283 }
284 }
285
286 double G1Analytics::predict_object_copy_time_ms(size_t bytes_to_copy, bool during_concurrent_mark) const {
287 if (during_concurrent_mark) {
288 return predict_object_copy_time_ms_during_cm(bytes_to_copy);
289 } else {
290 return bytes_to_copy * predict_zero_bounded(_copy_cost_per_byte_ms_seq);
291 }
292 }
293
294 double G1Analytics::predict_survivor_ratio() const {
295 return predict_in_unit_interval(_survivor_ratio);
296 }
297
298 double G1Analytics::predict_constant_other_time_ms() const {
299 return predict_zero_bounded(_constant_other_time_ms_seq);
300 }
301
302 double G1Analytics::predict_young_other_time_ms(size_t young_num) const {
303 return young_num * predict_zero_bounded(_young_other_cost_per_region_ms_seq);
304 }
305
306 double G1Analytics::predict_non_young_other_time_ms(size_t non_young_num) const {
307 return non_young_num * predict_zero_bounded(_non_young_other_cost_per_region_ms_seq);
308 }
309
310 double G1Analytics::predict_remark_time_ms() const {
311 return predict_zero_bounded(_concurrent_mark_remark_times_ms);
312 }
313
314 double G1Analytics::predict_cleanup_time_ms() const {
315 return predict_zero_bounded(_concurrent_mark_cleanup_times_ms);
|