1285 } 1286 1287 void G1CollectorPolicy::report_ihop_statistics() { 1288 _ihop_control->print(); 1289 } 1290 1291 void G1CollectorPolicy::print_phases() { 1292 phase_times()->print(); 1293 } 1294 1295 void G1CollectorPolicy::adjust_concurrent_refinement(double update_rs_time, 1296 double update_rs_processed_buffers, 1297 double goal_ms) { 1298 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); 1299 ConcurrentG1Refine *cg1r = G1CollectedHeap::heap()->concurrent_g1_refine(); 1300 1301 if (G1UseAdaptiveConcRefinement) { 1302 const int k_gy = 3, k_gr = 6; 1303 const double inc_k = 1.1, dec_k = 0.9; 1304 1305 int g = cg1r->green_zone(); 1306 if (update_rs_time > goal_ms) { 1307 g = (int)(g * dec_k); // Can become 0, that's OK. That would mean a mutator-only processing. 1308 } else { 1309 if (update_rs_time < goal_ms && update_rs_processed_buffers > g) { 1310 g = (int)MAX2(g * inc_k, g + 1.0); 1311 } 1312 } 1313 // Change the refinement threads params 1314 cg1r->set_green_zone(g); 1315 cg1r->set_yellow_zone(g * k_gy); 1316 cg1r->set_red_zone(g * k_gr); 1317 cg1r->reinitialize_threads(); 1318 1319 int processing_threshold_delta = MAX2((int)(cg1r->green_zone() * _predictor.sigma()), 1); 1320 int processing_threshold = MIN2(cg1r->green_zone() + processing_threshold_delta, 1321 cg1r->yellow_zone()); 1322 // Change the barrier params 1323 dcqs.set_process_completed_threshold(processing_threshold); 1324 dcqs.set_max_completed_queue(cg1r->red_zone()); 1325 } 1326 1327 int curr_queue_size = dcqs.completed_buffers_num(); 1328 if (curr_queue_size >= cg1r->yellow_zone()) { 1329 dcqs.set_completed_queue_padding(curr_queue_size); 1330 } else { 1331 dcqs.set_completed_queue_padding(0); 1332 } 1333 dcqs.notify_if_necessary(); 1334 } 1335 1336 size_t G1CollectorPolicy::predict_rs_length_diff() const { 1337 return get_new_size_prediction(_rs_length_diff_seq); 1338 } 1339 1340 double G1CollectorPolicy::predict_alloc_rate_ms() const { 1341 return get_new_prediction(_alloc_rate_ms_seq); 1342 } 1343 1344 double G1CollectorPolicy::predict_cost_per_card_ms() const { 1345 return get_new_prediction(_cost_per_card_ms_seq); 1346 } 1347 | 1285 } 1286 1287 void G1CollectorPolicy::report_ihop_statistics() { 1288 _ihop_control->print(); 1289 } 1290 1291 void G1CollectorPolicy::print_phases() { 1292 phase_times()->print(); 1293 } 1294 1295 void G1CollectorPolicy::adjust_concurrent_refinement(double update_rs_time, 1296 double update_rs_processed_buffers, 1297 double goal_ms) { 1298 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); 1299 ConcurrentG1Refine *cg1r = G1CollectedHeap::heap()->concurrent_g1_refine(); 1300 1301 if (G1UseAdaptiveConcRefinement) { 1302 const int k_gy = 3, k_gr = 6; 1303 const double inc_k = 1.1, dec_k = 0.9; 1304 1305 size_t g = cg1r->green_zone(); 1306 if (update_rs_time > goal_ms) { 1307 g = (size_t)(g * dec_k); // Can become 0, that's OK. That would mean a mutator-only processing. 1308 } else { 1309 if (update_rs_time < goal_ms && update_rs_processed_buffers > g) { 1310 g = (size_t)MAX2(g * inc_k, g + 1.0); 1311 } 1312 } 1313 // Change the refinement threads params 1314 cg1r->set_green_zone(g); 1315 cg1r->set_yellow_zone(g * k_gy); 1316 cg1r->set_red_zone(g * k_gr); 1317 cg1r->reinitialize_threads(); 1318 1319 size_t processing_threshold_delta = MAX2<size_t>(cg1r->green_zone() * _predictor.sigma(), 1); 1320 size_t processing_threshold = MIN2(cg1r->green_zone() + processing_threshold_delta, 1321 cg1r->yellow_zone()); 1322 // Change the barrier params 1323 dcqs.set_process_completed_threshold((int)processing_threshold); 1324 dcqs.set_max_completed_queue((int)cg1r->red_zone()); 1325 } 1326 1327 size_t curr_queue_size = dcqs.completed_buffers_num(); 1328 if (curr_queue_size >= cg1r->yellow_zone()) { 1329 dcqs.set_completed_queue_padding(curr_queue_size); 1330 } else { 1331 dcqs.set_completed_queue_padding(0); 1332 } 1333 dcqs.notify_if_necessary(); 1334 } 1335 1336 size_t G1CollectorPolicy::predict_rs_length_diff() const { 1337 return get_new_size_prediction(_rs_length_diff_seq); 1338 } 1339 1340 double G1CollectorPolicy::predict_alloc_rate_ms() const { 1341 return get_new_prediction(_alloc_rate_ms_seq); 1342 } 1343 1344 double G1CollectorPolicy::predict_cost_per_card_ms() const { 1345 return get_new_prediction(_cost_per_card_ms_seq); 1346 } 1347 |