< prev index next >

src/hotspot/share/gc/g1/g1Analytics.cpp

Print this page
rev 57223 : imported patch 8225484-changes-to-survivor-calculation


  77     _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
  78     _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  79     _prev_collection_pause_end_ms(0.0),
  80     _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
  81     _concurrent_refine_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  82     _logged_cards_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  83     _young_card_merge_to_scan_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
  84     _mixed_card_merge_to_scan_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
  85     _young_cost_per_card_scan_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  86     _mixed_cost_per_card_scan_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  87     _young_cost_per_card_merge_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  88     _mixed_cost_per_card_merge_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  89     _copy_cost_per_byte_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  90     _constant_other_time_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  91     _young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  92     _non_young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  93     _pending_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
  94     _rs_length_seq(new TruncatedSeq(TruncatedSeqLength)),
  95     _cost_per_byte_ms_during_cm_seq(new TruncatedSeq(TruncatedSeqLength)),
  96     _recent_prev_end_times_for_all_gcs_sec(new TruncatedSeq(NumPrevPausesForHeuristics)),

  97     _recent_avg_pause_time_ratio(0.0),
  98     _last_pause_time_ratio(0.0) {
  99 
 100   // Seed sequences with initial values.
 101   _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime());
 102   _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0;
 103 
 104   int index = MIN2(ParallelGCThreads - 1, 7u);
 105 
 106   _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
 107   // Start with inverse of maximum STW cost.
 108   _concurrent_refine_rate_ms_seq->add(1/cost_per_logged_card_ms_defaults[0]);
 109   // Some applications have very low rates for logging cards.
 110   _logged_cards_rate_ms_seq->add(0.0);
 111   _young_card_merge_to_scan_ratio_seq->add(young_card_merge_to_scan_ratio_defaults[index]);
 112   _young_cost_per_card_scan_ms_seq->add(young_only_cost_per_card_scan_ms_defaults[index]);
 113 
 114   _copy_cost_per_byte_ms_seq->add(cost_per_byte_ms_defaults[index]);
 115   _constant_other_time_ms_seq->add(constant_other_time_ms_defaults[index]);
 116   _young_other_cost_per_region_ms_seq->add(young_other_cost_per_region_ms_defaults[index]);
 117   _non_young_other_cost_per_region_ms_seq->add(non_young_other_cost_per_region_ms_defaults[index]);
 118 
 119   // start conservatively (around 50ms is about right)
 120   _concurrent_mark_remark_times_ms->add(0.05);
 121   _concurrent_mark_cleanup_times_ms->add(0.20);


 122 }
 123 
 124 bool G1Analytics::enough_samples_available(TruncatedSeq const* seq) const {
 125   return seq->num() >= 3;
 126 }
 127 
 128 double G1Analytics::predict_in_unit_interval(TruncatedSeq const* seq) const {
 129   return _predictor->predict_in_unit_interval(seq);
 130 }
 131 
 132 size_t G1Analytics::predict_size(TruncatedSeq const* seq) const {
 133   return (size_t)predict_zero_bounded(seq);
 134 }
 135 
 136 double G1Analytics::predict_zero_bounded(TruncatedSeq const* seq) const {
 137   return _predictor->predict_zero_bounded(seq);
 138 }
 139 
 140 int G1Analytics::num_alloc_rate_ms() const {
 141   return _alloc_rate_ms_seq->num();


 211 void G1Analytics::report_young_other_cost_per_region_ms(double other_cost_per_region_ms) {
 212   _young_other_cost_per_region_ms_seq->add(other_cost_per_region_ms);
 213 }
 214 
 215 void G1Analytics::report_non_young_other_cost_per_region_ms(double other_cost_per_region_ms) {
 216   _non_young_other_cost_per_region_ms_seq->add(other_cost_per_region_ms);
 217 }
 218 
 219 void G1Analytics::report_constant_other_time_ms(double constant_other_time_ms) {
 220   _constant_other_time_ms_seq->add(constant_other_time_ms);
 221 }
 222 
 223 void G1Analytics::report_pending_cards(double pending_cards) {
 224   _pending_cards_seq->add(pending_cards);
 225 }
 226 
 227 void G1Analytics::report_rs_length(double rs_length) {
 228   _rs_length_seq->add(rs_length);
 229 }
 230 




 231 double G1Analytics::predict_alloc_rate_ms() const {
 232   return predict_zero_bounded(_alloc_rate_ms_seq);
 233 }
 234 
 235 double G1Analytics::predict_concurrent_refine_rate_ms() const {
 236   return predict_zero_bounded(_concurrent_refine_rate_ms_seq);
 237 }
 238 
 239 double G1Analytics::predict_logged_cards_rate_ms() const {
 240   return predict_zero_bounded(_logged_cards_rate_ms_seq);
 241 }
 242 
 243 double G1Analytics::predict_young_card_merge_to_scan_ratio() const {
 244   return predict_in_unit_interval(_young_card_merge_to_scan_ratio_seq);
 245 }
 246 
 247 size_t G1Analytics::predict_scan_card_num(size_t rs_length, bool for_young_gc) const {
 248   if (for_young_gc || !enough_samples_available(_mixed_card_merge_to_scan_ratio_seq)) {
 249     return (size_t)(rs_length * predict_young_card_merge_to_scan_ratio());
 250   } else {


 265     return card_num * predict_zero_bounded(_young_cost_per_card_scan_ms_seq);
 266   } else {
 267     return card_num * predict_zero_bounded(_mixed_cost_per_card_scan_ms_seq);
 268   }
 269 }
 270 
 271 double G1Analytics::predict_object_copy_time_ms_during_cm(size_t bytes_to_copy) const {
 272   if (!enough_samples_available(_cost_per_byte_ms_during_cm_seq)) {
 273     return (1.1 * bytes_to_copy) * predict_zero_bounded(_copy_cost_per_byte_ms_seq);
 274   } else {
 275     return bytes_to_copy * predict_zero_bounded(_cost_per_byte_ms_during_cm_seq);
 276   }
 277 }
 278 
 279 double G1Analytics::predict_object_copy_time_ms(size_t bytes_to_copy, bool during_concurrent_mark) const {
 280   if (during_concurrent_mark) {
 281     return predict_object_copy_time_ms_during_cm(bytes_to_copy);
 282   } else {
 283     return bytes_to_copy * predict_zero_bounded(_copy_cost_per_byte_ms_seq);
 284   }




 285 }
 286 
 287 double G1Analytics::predict_constant_other_time_ms() const {
 288   return predict_zero_bounded(_constant_other_time_ms_seq);
 289 }
 290 
 291 double G1Analytics::predict_young_other_time_ms(size_t young_num) const {
 292   return young_num * predict_zero_bounded(_young_other_cost_per_region_ms_seq);
 293 }
 294 
 295 double G1Analytics::predict_non_young_other_time_ms(size_t non_young_num) const {
 296   return non_young_num * predict_zero_bounded(_non_young_other_cost_per_region_ms_seq);
 297 }
 298 
 299 double G1Analytics::predict_remark_time_ms() const {
 300   return predict_zero_bounded(_concurrent_mark_remark_times_ms);
 301 }
 302 
 303 double G1Analytics::predict_cleanup_time_ms() const {
 304   return predict_zero_bounded(_concurrent_mark_cleanup_times_ms);




  77     _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
  78     _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  79     _prev_collection_pause_end_ms(0.0),
  80     _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
  81     _concurrent_refine_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  82     _logged_cards_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  83     _young_card_merge_to_scan_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
  84     _mixed_card_merge_to_scan_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
  85     _young_cost_per_card_scan_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  86     _mixed_cost_per_card_scan_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  87     _young_cost_per_card_merge_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  88     _mixed_cost_per_card_merge_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  89     _copy_cost_per_byte_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  90     _constant_other_time_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  91     _young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  92     _non_young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
  93     _pending_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
  94     _rs_length_seq(new TruncatedSeq(TruncatedSeqLength)),
  95     _cost_per_byte_ms_during_cm_seq(new TruncatedSeq(TruncatedSeqLength)),
  96     _recent_prev_end_times_for_all_gcs_sec(new TruncatedSeq(NumPrevPausesForHeuristics)),
  97     _survivor_ratio(new TruncatedSeq(TruncatedSeqLength)),
  98     _recent_avg_pause_time_ratio(0.0),
  99     _last_pause_time_ratio(0.0) {
 100 
 101   // Seed sequences with initial values.
 102   _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime());
 103   _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0;
 104 
 105   int index = MIN2(ParallelGCThreads - 1, 7u);
 106 
 107   _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
 108   // Start with inverse of maximum STW cost.
 109   _concurrent_refine_rate_ms_seq->add(1/cost_per_logged_card_ms_defaults[0]);
 110   // Some applications have very low rates for logging cards.
 111   _logged_cards_rate_ms_seq->add(0.0);
 112   _young_card_merge_to_scan_ratio_seq->add(young_card_merge_to_scan_ratio_defaults[index]);
 113   _young_cost_per_card_scan_ms_seq->add(young_only_cost_per_card_scan_ms_defaults[index]);
 114 
 115   _copy_cost_per_byte_ms_seq->add(cost_per_byte_ms_defaults[index]);
 116   _constant_other_time_ms_seq->add(constant_other_time_ms_defaults[index]);
 117   _young_other_cost_per_region_ms_seq->add(young_other_cost_per_region_ms_defaults[index]);
 118   _non_young_other_cost_per_region_ms_seq->add(non_young_other_cost_per_region_ms_defaults[index]);
 119 
 120   // start conservatively (around 50ms is about right)
 121   _concurrent_mark_remark_times_ms->add(0.05);
 122   _concurrent_mark_cleanup_times_ms->add(0.20);
 123 
 124   _survivor_ratio->add(0.5);
 125 }
 126 
 127 bool G1Analytics::enough_samples_available(TruncatedSeq const* seq) const {
 128   return seq->num() >= 3;
 129 }
 130 
 131 double G1Analytics::predict_in_unit_interval(TruncatedSeq const* seq) const {
 132   return _predictor->predict_in_unit_interval(seq);
 133 }
 134 
 135 size_t G1Analytics::predict_size(TruncatedSeq const* seq) const {
 136   return (size_t)predict_zero_bounded(seq);
 137 }
 138 
 139 double G1Analytics::predict_zero_bounded(TruncatedSeq const* seq) const {
 140   return _predictor->predict_zero_bounded(seq);
 141 }
 142 
 143 int G1Analytics::num_alloc_rate_ms() const {
 144   return _alloc_rate_ms_seq->num();


 214 void G1Analytics::report_young_other_cost_per_region_ms(double other_cost_per_region_ms) {
 215   _young_other_cost_per_region_ms_seq->add(other_cost_per_region_ms);
 216 }
 217 
 218 void G1Analytics::report_non_young_other_cost_per_region_ms(double other_cost_per_region_ms) {
 219   _non_young_other_cost_per_region_ms_seq->add(other_cost_per_region_ms);
 220 }
 221 
 222 void G1Analytics::report_constant_other_time_ms(double constant_other_time_ms) {
 223   _constant_other_time_ms_seq->add(constant_other_time_ms);
 224 }
 225 
 226 void G1Analytics::report_pending_cards(double pending_cards) {
 227   _pending_cards_seq->add(pending_cards);
 228 }
 229 
 230 void G1Analytics::report_rs_length(double rs_length) {
 231   _rs_length_seq->add(rs_length);
 232 }
 233 
 234 void G1Analytics::report_survivor_ratio(double ratio) {
 235   _survivor_ratio->add(ratio);
 236 }
 237 
 238 double G1Analytics::predict_alloc_rate_ms() const {
 239   return predict_zero_bounded(_alloc_rate_ms_seq);
 240 }
 241 
 242 double G1Analytics::predict_concurrent_refine_rate_ms() const {
 243   return predict_zero_bounded(_concurrent_refine_rate_ms_seq);
 244 }
 245 
 246 double G1Analytics::predict_logged_cards_rate_ms() const {
 247   return predict_zero_bounded(_logged_cards_rate_ms_seq);
 248 }
 249 
 250 double G1Analytics::predict_young_card_merge_to_scan_ratio() const {
 251   return predict_in_unit_interval(_young_card_merge_to_scan_ratio_seq);
 252 }
 253 
 254 size_t G1Analytics::predict_scan_card_num(size_t rs_length, bool for_young_gc) const {
 255   if (for_young_gc || !enough_samples_available(_mixed_card_merge_to_scan_ratio_seq)) {
 256     return (size_t)(rs_length * predict_young_card_merge_to_scan_ratio());
 257   } else {


 272     return card_num * predict_zero_bounded(_young_cost_per_card_scan_ms_seq);
 273   } else {
 274     return card_num * predict_zero_bounded(_mixed_cost_per_card_scan_ms_seq);
 275   }
 276 }
 277 
 278 double G1Analytics::predict_object_copy_time_ms_during_cm(size_t bytes_to_copy) const {
 279   if (!enough_samples_available(_cost_per_byte_ms_during_cm_seq)) {
 280     return (1.1 * bytes_to_copy) * predict_zero_bounded(_copy_cost_per_byte_ms_seq);
 281   } else {
 282     return bytes_to_copy * predict_zero_bounded(_cost_per_byte_ms_during_cm_seq);
 283   }
 284 }
 285 
 286 double G1Analytics::predict_object_copy_time_ms(size_t bytes_to_copy, bool during_concurrent_mark) const {
 287   if (during_concurrent_mark) {
 288     return predict_object_copy_time_ms_during_cm(bytes_to_copy);
 289   } else {
 290     return bytes_to_copy * predict_zero_bounded(_copy_cost_per_byte_ms_seq);
 291   }
 292 }
 293 
 294 double G1Analytics::predict_survivor_ratio() const {
 295   return predict_in_unit_interval(_survivor_ratio);
 296 }
 297 
 298 double G1Analytics::predict_constant_other_time_ms() const {
 299   return predict_zero_bounded(_constant_other_time_ms_seq);
 300 }
 301 
 302 double G1Analytics::predict_young_other_time_ms(size_t young_num) const {
 303   return young_num * predict_zero_bounded(_young_other_cost_per_region_ms_seq);
 304 }
 305 
 306 double G1Analytics::predict_non_young_other_time_ms(size_t non_young_num) const {
 307   return non_young_num * predict_zero_bounded(_non_young_other_cost_per_region_ms_seq);
 308 }
 309 
 310 double G1Analytics::predict_remark_time_ms() const {
 311   return predict_zero_bounded(_concurrent_mark_remark_times_ms);
 312 }
 313 
 314 double G1Analytics::predict_cleanup_time_ms() const {
 315   return predict_zero_bounded(_concurrent_mark_cleanup_times_ms);


< prev index next >