comparison src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp @ 3919:4f41766176cf

7084509: G1: fix inconsistencies and mistakes in the young list target length calculations Summary: Fixed inconsistencies and mistakes in the young list target length calculations so that a) the calculated target length is optimal (before, it was not), b) other parameters like max survivor size and max gc locker eden expansion are always consistent with the calculated target length (before, they were not always), and c) the resulting target length was always bound by desired min and max values (before, it was not). Reviewed-by: brutisso, johnc
author tonyp
date Thu, 08 Sep 2011 05:16:49 -0400
parents 20213c8a3c40
children af2ab04e0038
comparison
equal deleted inserted replaced
3918:a6128a8ed624 3919:4f41766176cf
181 bool _full_young_gcs; 181 bool _full_young_gcs;
182 182
183 // if true, then it tries to dynamically adjust the length of the 183 // if true, then it tries to dynamically adjust the length of the
184 // young list 184 // young list
185 bool _adaptive_young_list_length; 185 bool _adaptive_young_list_length;
186 size_t _young_list_min_length;
187 size_t _young_list_target_length; 186 size_t _young_list_target_length;
188 size_t _young_list_fixed_length; 187 size_t _young_list_fixed_length;
189 188
190 // The max number of regions we can extend the eden by while the GC 189 // The max number of regions we can extend the eden by while the GC
191 // locker is active. This should be >= _young_list_target_length; 190 // locker is active. This should be >= _young_list_target_length;
204 SurvRateGroup* _short_lived_surv_rate_group; 203 SurvRateGroup* _short_lived_surv_rate_group;
205 SurvRateGroup* _survivor_surv_rate_group; 204 SurvRateGroup* _survivor_surv_rate_group;
206 // add here any more surv rate groups 205 // add here any more surv rate groups
207 206
208 double _gc_overhead_perc; 207 double _gc_overhead_perc;
208
209 double _reserve_factor;
210 size_t _reserve_regions;
209 211
210 bool during_marking() { 212 bool during_marking() {
211 return _during_marking; 213 return _during_marking;
212 } 214 }
213 215
453 double predict_base_elapsed_time_ms(size_t pending_cards); 455 double predict_base_elapsed_time_ms(size_t pending_cards);
454 double predict_base_elapsed_time_ms(size_t pending_cards, 456 double predict_base_elapsed_time_ms(size_t pending_cards,
455 size_t scanned_cards); 457 size_t scanned_cards);
456 size_t predict_bytes_to_copy(HeapRegion* hr); 458 size_t predict_bytes_to_copy(HeapRegion* hr);
457 double predict_region_elapsed_time_ms(HeapRegion* hr, bool young); 459 double predict_region_elapsed_time_ms(HeapRegion* hr, bool young);
458
459 // for use by: calculate_young_list_target_length(rs_length)
460 bool predict_will_fit(size_t young_region_num,
461 double base_time_ms,
462 size_t init_free_regions,
463 double target_pause_time_ms);
464 460
465 void start_recording_regions(); 461 void start_recording_regions();
466 void record_cset_region_info(HeapRegion* hr, bool young); 462 void record_cset_region_info(HeapRegion* hr, bool young);
467 void record_non_young_cset_region(HeapRegion* hr); 463 void record_non_young_cset_region(HeapRegion* hr);
468 464
769 double _cur_mark_stop_world_time_ms; 765 double _cur_mark_stop_world_time_ms;
770 double _mark_remark_start_sec; 766 double _mark_remark_start_sec;
771 double _mark_cleanup_start_sec; 767 double _mark_cleanup_start_sec;
772 double _mark_closure_time_ms; 768 double _mark_closure_time_ms;
773 769
774 void calculate_young_list_min_length(); 770 // Update the young list target length either by setting it to the
775 void calculate_young_list_target_length(); 771 // desired fixed value or by calculating it using G1's pause
776 void calculate_young_list_target_length(size_t rs_lengths); 772 // prediction model. If no rs_lengths parameter is passed, predict
773 // the RS lengths using the prediction model, otherwise use the
774 // given rs_lengths as the prediction.
775 void update_young_list_target_length(size_t rs_lengths = (size_t) -1);
776
777 // Calculate and return the minimum desired young list target
778 // length. This is the minimum desired young list length according
779 // to the user's inputs.
780 size_t calculate_young_list_desired_min_length(size_t base_min_length);
781
782 // Calculate and return the maximum desired young list target
783 // length. This is the maximum desired young list length according
784 // to the user's inputs.
785 size_t calculate_young_list_desired_max_length();
786
787 // Calculate and return the maximum young list target length that
788 // can fit into the pause time goal. The parameters are: rs_lengths
789 // represent the prediction of how large the young RSet lengths will
790 // be, base_min_length is the alreay existing number of regions in
791 // the young list, min_length and max_length are the desired min and
792 // max young list length according to the user's inputs.
793 size_t calculate_young_list_target_length(size_t rs_lengths,
794 size_t base_min_length,
795 size_t desired_min_length,
796 size_t desired_max_length);
797
798 // Check whether a given young length (young_length) fits into the
799 // given target pause time and whether the prediction for the amount
800 // of objects to be copied for the given length will fit into the
801 // given free space (expressed by base_free_regions). It is used by
802 // calculate_young_list_target_length().
803 bool predict_will_fit(size_t young_length, double base_time_ms,
804 size_t base_free_regions, double target_pause_time_ms);
777 805
778 public: 806 public:
779 807
780 G1CollectorPolicy(); 808 G1CollectorPolicy();
781 809
783 811
784 virtual CollectorPolicy::Name kind() { 812 virtual CollectorPolicy::Name kind() {
785 return CollectorPolicy::G1CollectorPolicyKind; 813 return CollectorPolicy::G1CollectorPolicyKind;
786 } 814 }
787 815
788 void check_prediction_validity(); 816 // Check the current value of the young list RSet lengths and
817 // compare it against the last prediction. If the current value is
818 // higher, recalculate the young list target length prediction.
819 void revise_young_list_target_length_if_necessary();
789 820
790 size_t bytes_in_collection_set() { 821 size_t bytes_in_collection_set() {
791 return _bytes_in_collection_set_before_gc; 822 return _bytes_in_collection_set_before_gc;
792 } 823 }
793 824
794 unsigned calc_gc_alloc_time_stamp() { 825 unsigned calc_gc_alloc_time_stamp() {
795 return _all_pause_times_ms->num() + 1; 826 return _all_pause_times_ms->num() + 1;
796 } 827 }
828
829 // Recalculate the reserve region number. This should be called
830 // after the heap is resized.
831 void calculate_reserve(size_t all_regions);
797 832
798 protected: 833 protected:
799 834
800 // Count the number of bytes used in the CS. 835 // Count the number of bytes used in the CS.
801 void count_CS_bytes_used(); 836 void count_CS_bytes_used();
1201 void record_thread_age_table(ageTable* age_table) 1236 void record_thread_age_table(ageTable* age_table)
1202 { 1237 {
1203 _survivors_age_table.merge_par(age_table); 1238 _survivors_age_table.merge_par(age_table);
1204 } 1239 }
1205 1240
1206 void calculate_max_gc_locker_expansion(); 1241 void update_max_gc_locker_expansion();
1207 1242
1208 // Calculates survivor space parameters. 1243 // Calculates survivor space parameters.
1209 void calculate_survivors_policy(); 1244 void update_survivors_policy();
1210 1245
1211 }; 1246 };
1212 1247
1213 // This encapsulates a particular strategy for a g1 Collector. 1248 // This encapsulates a particular strategy for a g1 Collector.
1214 // 1249 //