--- old/src/hotspot/share/gc/g1/g1Policy.cpp 2019-11-18 16:08:47.022380371 +0100 +++ new/src/hotspot/share/gc/g1/g1Policy.cpp 2019-11-18 16:08:46.670369476 +0100 @@ -62,7 +62,7 @@ _young_list_target_length(0), _young_list_fixed_length(0), _young_list_max_length(0), - _short_lived_surv_rate_group(new SurvRateGroup()), + _eden_surv_rate_group(new SurvRateGroup()), _survivor_surv_rate_group(new SurvRateGroup()), _reserve_factor((double) G1ReservePercent / 100.0), _reserve_regions(0), @@ -127,7 +127,6 @@ } class G1YoungLengthPredictor { - const bool _during_cm; const double _base_time_ms; const double _base_free_regions; const double _target_pause_time_ms; @@ -139,7 +138,6 @@ double base_free_regions, double target_pause_time_ms, const G1Policy* policy) : - _during_cm(during_cm), _base_time_ms(base_time_ms), _base_free_regions(base_free_regions), _target_pause_time_ms(target_pause_time_ms), @@ -151,11 +149,8 @@ return false; } - const double accum_surv_rate = _policy->accum_yg_surv_rate_pred((int) young_length - 1); - const size_t bytes_to_copy = - (size_t) (accum_surv_rate * (double) HeapRegion::GrainBytes); - const double copy_time_ms = - _policy->analytics()->predict_object_copy_time_ms(bytes_to_copy, _during_cm); + size_t bytes_to_copy = 0; + const double copy_time_ms = _policy->predict_eden_copy_time_ms(young_length, &bytes_to_copy); const double young_other_time_ms = _policy->analytics()->predict_young_other_time_ms(young_length); const double pause_time_ms = _base_time_ms + copy_time_ms + young_other_time_ms; if (pause_time_ms > _target_pause_time_ms) { @@ -303,11 +298,10 @@ return result; } -uint -G1Policy::calculate_young_list_target_length(size_t rs_length, - uint base_min_length, - uint desired_min_length, - uint desired_max_length) const { +uint G1Policy::calculate_young_list_target_length(size_t rs_length, + uint base_min_length, + uint desired_min_length, + uint desired_max_length) const { assert(use_adaptive_young_list_length(), "pre-condition"); assert(collector_state()->in_young_only_phase(), "only call this for young GCs"); @@ -327,11 +321,8 @@ uint max_young_length = desired_max_length - base_min_length; const double target_pause_time_ms = _mmu_tracker->max_gc_time() * 1000.0; - const double survivor_regions_evac_time = predict_survivor_regions_evac_time(); const size_t pending_cards = _analytics->predict_pending_cards(); - const double base_time_ms = - predict_base_elapsed_time_ms(pending_cards, rs_length) + - survivor_regions_evac_time; + const double base_time_ms = predict_base_elapsed_time_ms(pending_cards, rs_length); const uint available_free_regions = _free_regions_at_end_of_collection; const uint base_free_regions = available_free_regions > _reserve_regions ? available_free_regions - _reserve_regions : 0; @@ -406,11 +397,10 @@ double G1Policy::predict_survivor_regions_evac_time() const { double survivor_regions_evac_time = 0.0; const GrowableArray* survivor_regions = _g1h->survivor()->regions(); - for (GrowableArrayIterator it = survivor_regions->begin(); it != survivor_regions->end(); ++it) { - survivor_regions_evac_time += predict_region_elapsed_time_ms(*it, collector_state()->in_young_only_phase()); + survivor_regions_evac_time += predict_region_total_time_ms(*it, collector_state()->in_young_only_phase()); } return survivor_regions_evac_time; } @@ -466,7 +456,7 @@ collector_state()->set_mark_or_rebuild_in_progress(false); collector_state()->set_clearing_next_bitmap(false); - _short_lived_surv_rate_group->start_adding_regions(); + _eden_surv_rate_group->start_adding_regions(); // also call this on any additional surv rate groups _free_regions_at_end_of_collection = _g1h->num_free_regions(); @@ -553,7 +543,7 @@ _collection_set->reset_bytes_used_before(); // do that for any other surv rate groups - _short_lived_surv_rate_group->stop_adding_regions(); + _eden_surv_rate_group->stop_adding_regions(); _survivors_age_table.clear(); assert(_g1h->collection_set()->verify_young_ages(), "region age verification failed"); @@ -711,7 +701,7 @@ } } - _short_lived_surv_rate_group->start_adding_regions(); + _eden_surv_rate_group->start_adding_regions(); double merge_hcc_time_ms = average_time_ms(G1GCPhaseTimes::MergeHCC); if (update_stats) { @@ -907,17 +897,14 @@ phase_times()->print(); } -double G1Policy::accum_yg_surv_rate_pred(int age) const { - return _short_lived_surv_rate_group->accum_surv_rate_pred(age); -} - double G1Policy::predict_base_elapsed_time_ms(size_t pending_cards, size_t rs_length) const { size_t effective_scanned_cards = _analytics->predict_scan_card_num(rs_length, collector_state()->in_young_only_phase()); return _analytics->predict_card_merge_time_ms(pending_cards + rs_length, collector_state()->in_young_only_phase()) + _analytics->predict_card_scan_time_ms(effective_scanned_cards, collector_state()->in_young_only_phase()) + - _analytics->predict_constant_other_time_ms(); + _analytics->predict_constant_other_time_ms() + + predict_survivor_regions_evac_time(); } double G1Policy::predict_base_elapsed_time_ms(size_t pending_cards) const { @@ -935,17 +922,30 @@ return bytes_to_copy; } -double G1Policy::predict_region_elapsed_time_ms(HeapRegion* hr, - bool for_young_gc) const { +double G1Policy::predict_eden_copy_time_ms(uint count, size_t* bytes_to_copy) const { + if (count == 0) { + return 0.0; + } + size_t const expected_bytes = _eden_surv_rate_group->accum_surv_rate_pred(count) * HeapRegion::GrainBytes; + if (bytes_to_copy != NULL) { + *bytes_to_copy = expected_bytes; + } + return _analytics->predict_object_copy_time_ms(expected_bytes, collector_state()->mark_or_rebuild_in_progress()); +} + +double G1Policy::predict_region_copy_time_ms(HeapRegion* hr) const { + size_t const bytes_to_copy = predict_bytes_to_copy(hr); + return _analytics->predict_object_copy_time_ms(bytes_to_copy, collector_state()->mark_or_rebuild_in_progress()); +} + +double G1Policy::predict_region_non_copy_time_ms(HeapRegion* hr, + bool for_young_gc) const { size_t rs_length = hr->rem_set()->occupied(); size_t scan_card_num = _analytics->predict_scan_card_num(rs_length, for_young_gc); - size_t bytes_to_copy = predict_bytes_to_copy(hr); - double region_elapsed_time_ms = _analytics->predict_card_merge_time_ms(rs_length, collector_state()->in_young_only_phase()) + - _analytics->predict_card_scan_time_ms(scan_card_num, collector_state()->in_young_only_phase()) + - _analytics->predict_object_copy_time_ms(bytes_to_copy, collector_state()->mark_or_rebuild_in_progress()); + _analytics->predict_card_scan_time_ms(scan_card_num, collector_state()->in_young_only_phase()); // The prediction of the "other" time for this region is based // upon the region type and NOT the GC type. @@ -957,6 +957,10 @@ return region_elapsed_time_ms; } +double G1Policy::predict_region_total_time_ms(HeapRegion* hr, bool for_young_gc) const { + return predict_region_non_copy_time_ms(hr, for_young_gc) + predict_region_copy_time_ms(hr); +} + bool G1Policy::should_allocate_mutator_region() const { uint young_list_length = _g1h->young_regions_count(); uint young_list_target_length = _young_list_target_length; @@ -1304,7 +1308,7 @@ break; } - double predicted_time_ms = predict_region_elapsed_time_ms(hr, false); + double predicted_time_ms = predict_region_total_time_ms(hr, false); time_remaining_ms = MAX2(time_remaining_ms - predicted_time_ms, 0.0); // Add regions to old set until we reach the minimum amount if (num_initial_regions < min_old_cset_length) { @@ -1364,7 +1368,7 @@ HeapRegion* r = candidates->at(candidate_idx); while (num_optional_regions < max_optional_regions) { assert(r != NULL, "Region must exist"); - prediction_ms += predict_region_elapsed_time_ms(r, false); + prediction_ms += predict_region_total_time_ms(r, false); if (prediction_ms > time_remaining_ms) { log_debug(gc, ergo, cset)("Prediction %.3fms for region %u does not fit remaining time: %.3fms.",