diff -r 338b512e9b40 -r 4a2823c696ce hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp --- a/hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp Thu Oct 22 17:24:17 2015 +0000 +++ b/hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp Tue Oct 20 14:37:59 2015 +0200 @@ -431,7 +431,7 @@ } _free_regions_at_end_of_collection = _g1->num_free_regions(); - update_young_list_target_length(); + update_young_list_max_and_target_length(); // We may immediately start allocating regions and placing them on the // collection set list. Initialize the per-collection set info start_incremental_cset_building(); @@ -507,13 +507,24 @@ return _young_gen_sizer->max_desired_young_length(); } +void G1CollectorPolicy::update_young_list_max_and_target_length() { + update_young_list_max_and_target_length(get_new_prediction(_rs_lengths_seq)); +} + +void G1CollectorPolicy::update_young_list_max_and_target_length(size_t rs_lengths) { + update_young_list_target_length(rs_lengths); + update_max_gc_locker_expansion(); +} + void G1CollectorPolicy::update_young_list_target_length(size_t rs_lengths) { - if (rs_lengths == (size_t) -1) { - // if it's set to the default value (-1), we should predict it; - // otherwise, use the given value. - rs_lengths = (size_t) get_new_prediction(_rs_lengths_seq); - } + _young_list_target_length = bounded_young_list_target_length(rs_lengths); +} +void G1CollectorPolicy::update_young_list_target_length() { + update_young_list_target_length(get_new_prediction(_rs_lengths_seq)); +} + +uint G1CollectorPolicy::bounded_young_list_target_length(size_t rs_lengths) const { // Calculate the absolute and desired min bounds. // This is how many young regions we already have (currently: the survivors). @@ -544,7 +555,6 @@ base_min_length, desired_min_length, desired_max_length); - _rs_lengths_prediction = rs_lengths; } else { // Don't calculate anything and let the code below bound it to // the desired_min_length, i.e., do the next GC as soon as @@ -569,9 +579,8 @@ assert(young_list_target_length > recorded_survivor_regions(), "we should be able to allocate at least one eden region"); assert(young_list_target_length >= absolute_min_length, "post-condition"); - _young_list_target_length = young_list_target_length; - update_max_gc_locker_expansion(); + return young_list_target_length; } uint @@ -695,11 +704,21 @@ if (rs_lengths > _rs_lengths_prediction) { // add 10% to avoid having to recalculate often size_t rs_lengths_prediction = rs_lengths * 1100 / 1000; - update_young_list_target_length(rs_lengths_prediction); + update_rs_lengths_prediction(rs_lengths_prediction); + + update_young_list_max_and_target_length(rs_lengths_prediction); } } +void G1CollectorPolicy::update_rs_lengths_prediction() { + update_rs_lengths_prediction(get_new_prediction(_rs_lengths_seq)); +} +void G1CollectorPolicy::update_rs_lengths_prediction(size_t prediction) { + if (collector_state()->gcs_are_young() && adaptive_young_list_length()) { + _rs_lengths_prediction = prediction; + } +} HeapWord* G1CollectorPolicy::mem_allocate_work(size_t size, bool is_tlab, @@ -801,7 +820,8 @@ _free_regions_at_end_of_collection = _g1->num_free_regions(); // Reset survivors SurvRateGroup. _survivor_surv_rate_group->reset(); - update_young_list_target_length(); + update_young_list_max_and_target_length(); + update_rs_lengths_prediction(); _collectionSetChooser->clear(); } @@ -1147,7 +1167,8 @@ collector_state()->set_in_marking_window(new_in_marking_window); collector_state()->set_in_marking_window_im(new_in_marking_window_im); _free_regions_at_end_of_collection = _g1->num_free_regions(); - update_young_list_target_length(); + update_young_list_max_and_target_length(); + update_rs_lengths_prediction(); // Note that _mmu_tracker->max_gc_time() returns the time in seconds. double update_rs_time_goal_ms = _mmu_tracker->max_gc_time() * MILLIUNITS * G1RSetUpdatingPauseTimePercent / 100.0;