456 |
456 |
457 if (_alloc_rate_ms_seq->num() > 3) { |
457 if (_alloc_rate_ms_seq->num() > 3) { |
458 double now_sec = os::elapsedTime(); |
458 double now_sec = os::elapsedTime(); |
459 double when_ms = _mmu_tracker->when_max_gc_sec(now_sec) * 1000.0; |
459 double when_ms = _mmu_tracker->when_max_gc_sec(now_sec) * 1000.0; |
460 double alloc_rate_ms = predict_alloc_rate_ms(); |
460 double alloc_rate_ms = predict_alloc_rate_ms(); |
461 int min_regions = (int) ceil(alloc_rate_ms * when_ms); |
461 size_t min_regions = (size_t) ceil(alloc_rate_ms * when_ms); |
462 int current_region_num = (int) _g1->young_list()->length(); |
462 size_t current_region_num = _g1->young_list()->length(); |
463 _young_list_min_length = min_regions + current_region_num; |
463 _young_list_min_length = min_regions + current_region_num; |
464 } |
464 } |
465 } |
465 } |
466 |
466 |
467 void G1CollectorPolicy::calculate_young_list_target_length() { |
467 void G1CollectorPolicy::calculate_young_list_target_length() { |
471 } else { |
471 } else { |
472 if (full_young_gcs()) |
472 if (full_young_gcs()) |
473 _young_list_target_length = _young_list_fixed_length; |
473 _young_list_target_length = _young_list_fixed_length; |
474 else |
474 else |
475 _young_list_target_length = _young_list_fixed_length / 2; |
475 _young_list_target_length = _young_list_fixed_length / 2; |
476 |
476 } |
477 _young_list_target_length = MAX2(_young_list_target_length, (size_t)1); |
477 |
478 } |
478 // Make sure we allow the application to allocate at least one |
|
479 // region before we need to do a collection again. |
|
480 size_t min_length = _g1->young_list()->length() + 1; |
|
481 _young_list_target_length = MAX2(_young_list_target_length, min_length); |
479 calculate_survivors_policy(); |
482 calculate_survivors_policy(); |
480 } |
483 } |
481 |
484 |
482 void G1CollectorPolicy::calculate_young_list_target_length(size_t rs_lengths) { |
485 void G1CollectorPolicy::calculate_young_list_target_length(size_t rs_lengths) { |
483 guarantee( adaptive_young_list_length(), "pre-condition" ); |
486 guarantee( adaptive_young_list_length(), "pre-condition" ); |
566 } |
569 } |
567 // and we're done! |
570 // and we're done! |
568 |
571 |
569 // we should have at least one region in the target young length |
572 // we should have at least one region in the target young length |
570 _young_list_target_length = |
573 _young_list_target_length = |
571 MAX2((size_t) 1, final_young_length + _recorded_survivor_regions); |
574 final_young_length + _recorded_survivor_regions; |
572 |
575 |
573 // let's keep an eye of how long we spend on this calculation |
576 // let's keep an eye of how long we spend on this calculation |
574 // right now, I assume that we'll print it when we need it; we |
577 // right now, I assume that we'll print it when we need it; we |
575 // should really adde it to the breakdown of a pause |
578 // should really adde it to the breakdown of a pause |
576 double end_time_sec = os::elapsedTime(); |
579 double end_time_sec = os::elapsedTime(); |
615 // leave this in for debugging, just in case |
618 // leave this in for debugging, just in case |
616 gclog_or_tty->print_cr("(partial) setting target to " SIZE_FORMAT |
619 gclog_or_tty->print_cr("(partial) setting target to " SIZE_FORMAT |
617 _young_list_min_length); |
620 _young_list_min_length); |
618 #endif // TRACE_CALC_YOUNG_LENGTH |
621 #endif // TRACE_CALC_YOUNG_LENGTH |
619 // we'll do the pause as soon as possible by choosing the minimum |
622 // we'll do the pause as soon as possible by choosing the minimum |
620 _young_list_target_length = |
623 _young_list_target_length = _young_list_min_length; |
621 MAX2(_young_list_min_length, (size_t) 1); |
|
622 } |
624 } |
623 |
625 |
624 _rs_lengths_prediction = rs_lengths; |
626 _rs_lengths_prediction = rs_lengths; |
625 } |
627 } |
626 |
628 |
799 _free_regions_at_end_of_collection = _g1->free_regions(); |
801 _free_regions_at_end_of_collection = _g1->free_regions(); |
800 // Reset survivors SurvRateGroup. |
802 // Reset survivors SurvRateGroup. |
801 _survivor_surv_rate_group->reset(); |
803 _survivor_surv_rate_group->reset(); |
802 calculate_young_list_min_length(); |
804 calculate_young_list_min_length(); |
803 calculate_young_list_target_length(); |
805 calculate_young_list_target_length(); |
804 } |
806 } |
805 |
807 |
806 void G1CollectorPolicy::record_before_bytes(size_t bytes) { |
808 void G1CollectorPolicy::record_before_bytes(size_t bytes) { |
807 _bytes_in_to_space_before_gc += bytes; |
809 _bytes_in_to_space_before_gc += bytes; |
808 } |
810 } |
809 |
811 |
822 gclog_or_tty->print("[GC pause"); |
824 gclog_or_tty->print("[GC pause"); |
823 if (in_young_gc_mode()) |
825 if (in_young_gc_mode()) |
824 gclog_or_tty->print(" (%s)", full_young_gcs() ? "young" : "partial"); |
826 gclog_or_tty->print(" (%s)", full_young_gcs() ? "young" : "partial"); |
825 } |
827 } |
826 |
828 |
827 assert(_g1->used_regions() == _g1->recalculate_used_regions(), |
829 assert(_g1->used() == _g1->recalculate_used(), |
828 "sanity"); |
830 err_msg("sanity, used: "SIZE_FORMAT" recalculate_used: "SIZE_FORMAT, |
829 assert(_g1->used() == _g1->recalculate_used(), "sanity"); |
831 _g1->used(), _g1->recalculate_used())); |
830 |
832 |
831 double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0; |
833 double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0; |
832 _all_stop_world_times_ms->add(s_w_t_ms); |
834 _all_stop_world_times_ms->add(s_w_t_ms); |
833 _stop_world_start = 0.0; |
835 _stop_world_start = 0.0; |
834 |
836 |
2264 _short_lived_surv_rate_group->print_surv_rate_summary(); |
2266 _short_lived_surv_rate_group->print_surv_rate_summary(); |
2265 // add this call for any other surv rate groups |
2267 // add this call for any other surv rate groups |
2266 #endif // PRODUCT |
2268 #endif // PRODUCT |
2267 } |
2269 } |
2268 |
2270 |
2269 bool |
2271 void |
2270 G1CollectorPolicy::should_add_next_region_to_young_list() { |
2272 G1CollectorPolicy::update_region_num(bool young) { |
2271 assert(in_young_gc_mode(), "should be in young GC mode"); |
2273 if (young) { |
2272 bool ret; |
|
2273 size_t young_list_length = _g1->young_list()->length(); |
|
2274 size_t young_list_max_length = _young_list_target_length; |
|
2275 if (G1FixedEdenSize) { |
|
2276 young_list_max_length -= _max_survivor_regions; |
|
2277 } |
|
2278 if (young_list_length < young_list_max_length) { |
|
2279 ret = true; |
|
2280 ++_region_num_young; |
2274 ++_region_num_young; |
2281 } else { |
2275 } else { |
2282 ret = false; |
|
2283 ++_region_num_tenured; |
2276 ++_region_num_tenured; |
2284 } |
2277 } |
2285 |
|
2286 return ret; |
|
2287 } |
2278 } |
2288 |
2279 |
2289 #ifndef PRODUCT |
2280 #ifndef PRODUCT |
2290 // for debugging, bit of a hack... |
2281 // for debugging, bit of a hack... |
2291 static char* |
2282 static char* |
2323 _tenuring_threshold = MaxTenuringThreshold; |
2314 _tenuring_threshold = MaxTenuringThreshold; |
2324 } else { |
2315 } else { |
2325 _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold( |
2316 _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold( |
2326 HeapRegion::GrainWords * _max_survivor_regions); |
2317 HeapRegion::GrainWords * _max_survivor_regions); |
2327 } |
2318 } |
2328 } |
|
2329 |
|
2330 bool |
|
2331 G1CollectorPolicy_BestRegionsFirst::should_do_collection_pause(size_t |
|
2332 word_size) { |
|
2333 assert(_g1->regions_accounted_for(), "Region leakage!"); |
|
2334 double max_pause_time_ms = _mmu_tracker->max_gc_time() * 1000.0; |
|
2335 |
|
2336 size_t young_list_length = _g1->young_list()->length(); |
|
2337 size_t young_list_max_length = _young_list_target_length; |
|
2338 if (G1FixedEdenSize) { |
|
2339 young_list_max_length -= _max_survivor_regions; |
|
2340 } |
|
2341 bool reached_target_length = young_list_length >= young_list_max_length; |
|
2342 |
|
2343 if (in_young_gc_mode()) { |
|
2344 if (reached_target_length) { |
|
2345 assert( young_list_length > 0 && _g1->young_list()->length() > 0, |
|
2346 "invariant" ); |
|
2347 return true; |
|
2348 } |
|
2349 } else { |
|
2350 guarantee( false, "should not reach here" ); |
|
2351 } |
|
2352 |
|
2353 return false; |
|
2354 } |
2319 } |
2355 |
2320 |
2356 #ifndef PRODUCT |
2321 #ifndef PRODUCT |
2357 class HRSortIndexIsOKClosure: public HeapRegionClosure { |
2322 class HRSortIndexIsOKClosure: public HeapRegionClosure { |
2358 CollectionSetChooser* _chooser; |
2323 CollectionSetChooser* _chooser; |