--- old/src/hotspot/share/gc/g1/g1Policy.cpp 2020-02-11 11:34:49.216234312 +0100 +++ new/src/hotspot/share/gc/g1/g1Policy.cpp 2020-02-11 11:34:48.810221830 +0100 @@ -179,18 +179,38 @@ } }; -void G1Policy::record_new_heap_size(uint new_number_of_regions) { - // re-calculate the necessary reserve - double reserve_regions_d = (double) new_number_of_regions * _reserve_factor; - // We use ceiling so that if reserve_regions_d is > 0.0 (but - // smaller than 1.0) we'll get 1. - _reserve_regions = (uint) ceil(reserve_regions_d); - +void G1Policy::record_new_target_heap_size(uint new_number_of_regions, uint reserve_regions) { + _reserve_regions = reserve_regions; _young_gen_sizer->heap_size_changed(new_number_of_regions); - _ihop_control->update_target_occupancy(new_number_of_regions * HeapRegion::GrainBytes); } +void G1Policy::update_heap_target_size(uint num_regions, uint soft_goal_num_regions) { + uint desired_number_of_regions = MIN2(num_regions, soft_goal_num_regions); + + uint regular_reserve_regions = (uint)ceil((double)num_regions * G1ReservePercent / 100); + uint reserve_regions = regular_reserve_regions; + uint soft_reserve_regions = 0; + + if (soft_goal_num_regions < num_regions) { + soft_reserve_regions = num_regions - soft_goal_num_regions + + (uint)ceil((double)soft_goal_num_regions * G1ReservePercent / 100); + reserve_regions = soft_reserve_regions; + } + + // FIXME: this method is called very early during startup during initial heap expansion, so + // the _g1h member has not been set yet. + G1CollectedHeap* g1h = G1CollectedHeap::heap(); + uint MBPerRegion = HeapRegion::GrainBytes / (1024 * 1024); + log_error(gc)("heap target update: soft-goal %u committed %u goal %u hard-reserve %u soft-reserve %u reserve %u free %u used %u", + soft_goal_num_regions * MBPerRegion, num_regions * MBPerRegion, + desired_number_of_regions * MBPerRegion, + regular_reserve_regions * MBPerRegion, soft_reserve_regions * MBPerRegion, reserve_regions * MBPerRegion, + g1h->num_free_regions() * MBPerRegion, g1h->num_used_regions() * MBPerRegion); + + record_new_target_heap_size(desired_number_of_regions, reserve_regions); +} + uint G1Policy::calculate_young_list_desired_min_length(uint base_min_length) const { uint desired_min_length = 0; if (use_adaptive_young_list_length()) {